manifold
manifold

Reputation: 233

Drawing a graph partition with the networkX package in Python

I have a graph object G with nodes from 0 to n-1 and two lists L1 L2 which are a partition of the nodes of G. I'd like to draw G in such a way that the nodes result divided in two blocks: one relative to L1 and the other relative to L2. The aim of the picture should be to evidentiate the connections between L1 and L2. Can you help me do perform this task?

Many thanks in advance.

Upvotes: 2

Views: 2456

Answers (1)

Hooked
Hooked

Reputation: 88208

Draw each graph separately and use a disjoint product to generate a new graph that shows the edges:

enter image description here

import networkx as nx

n1, n2 = 10, 10

# Define two random graphs
g1 = nx.gnm_random_graph(n1,20)
g2 = nx.gnm_random_graph(n2,20)
pos1 = nx.graphviz_layout(g1,prog='dot')
pos2 = nx.graphviz_layout(g2,prog='dot')

# Shift graph2
shift = 400
for key in pos2:
    pos2[key] = (pos2[key][0]+shift, pos2[key][1])

# Combine the graphs and remove all edges
g12 = nx.disjoint_union(g1,g2)
for i,j in g12.edges():
    g12.remove_edge(i,j)

# Add the conjoined edges
g12.add_edge(5, 7+n1)
g12.add_edge(2, 3+n1)
g12.add_edge(8, 7+n1)

# Set the new pos for g12
pos12 = pos1.copy()
for node in pos2:
    pos12[node+n2] = pos2[node]

# Show the results, make the conjoined edges darker

import pylab as plt
nx.draw_networkx(g1,pos=pos1,alpha=0.5)
nx.draw_networkx(g2,pos=pos2,alpha=0.5)
nx.draw_networkx_edges(g12,pos=pos12,width=5)
plt.axis('off')
plt.show()

Upvotes: 1

Related Questions