8-Bit Borges
8-Bit Borges

Reputation: 10043

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?

Upvotes: 4

Views: 1395

Answers (1)

jylls
jylls

Reputation: 4705

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

Upvotes: 4

Related Questions