Search code examples
pythonnetworkx

Networkx - create graphs from communities


With the following working code:

import netowkx as nx
import networkx.algorithms.community as nx_comm

G = nx.karate_club_graph()

# Find the communities
communities = sorted(nx_comm.greedy_modularity_communities(G), key=len, reverse=True)
# Count the communities
print(f"The club has {len(communities)} communities.")

'''Add community to node attributes'''
for c, v_c in enumerate(communities):
    for v in v_c:
        # Add 1 to save 0 for external edges
        G.nodes[v]['community'] = c + 1
        

'''Find internal edges and add their community to their attributes'''
for v, w, in G.edges:
    if G.nodes[v]['community'] == G.nodes[w]['community']:
        # Internal edge, mark with community
        G.edges[v, w]['community'] = G.nodes[v]['community']
    else:
        # External edge, mark as 0
        G.edges[v, w]['community'] = 0

How do I end up with n new Graphs (or subgraphs), one object (described as "Graph with n nodes and w edges" )for each community?


Solution

  • You could use a similar approach than the one taken in this. First, you can create one graph for each of your communities. You can then identify the edges you want to add to each graph with [(u,v,d) for u,v,d in G.edges(data=True) if d['community'] == i+1]).

    This is what the code looks like:

    import networkx as nx
    import networkx.algorithms.community as nx_comm
    import matplotlib.pyplot as plt
    
    G = nx.karate_club_graph()
    
    # Find the communities
    communities = sorted(nx_comm.greedy_modularity_communities(G), key=len, reverse=True)
    
    # Count the communities
    print(f"The club has {len(communities)} communities.")
    
    '''Add community to node attributes'''
    for c, v_c in enumerate(communities):
        for v in v_c:
            # Add 1 to save 0 for external edges
            G.nodes[v]['community'] = c + 1
    
    '''Find internal edges and add their community to their attributes'''
    for v, w, in G.edges:
        if G.nodes[v]['community'] == G.nodes[w]['community']:
            # Internal edge, mark with community
            G.edges[v, w]['community'] = G.nodes[v]['community']
        else:
            # External edge, mark as 0
            G.edges[v, w]['community'] = 0
    
    
    
    N_coms=len(communities)
    edges_coms=[]#edge list for each community
    coms_G=[nx.Graph() for _ in range(N_coms)] #community graphs
    colors=['tab:blue','tab:orange','tab:green']
    fig=plt.figure(figsize=(12,5))
    
    for i in range(N_coms):
      edges_coms.append([(u,v,d) for u,v,d in G.edges(data=True) if d['community'] == i+1])#identify edges of interest using the edge attribute
      coms_G[i].add_edges_from(edges_coms[i]) #add edges
      plt.subplot(1,3,i+1)#plot communities
      plt.title('Community '+str(i+1))
      pos = nx.circular_layout(coms_G[i])
      nx.draw(coms_G[i],pos=pos,with_labels=True,node_color=colors[i]) 
    

    And the output gives:

    enter image description here