Python-如何使用networkx.draw()显示具有不同节点形状的定向多重图



我在这里看到了一个类似的问题,以及它对有向图的公认答案。有向图的想法是将节点添加到与节点形状("o"、"d"、"s"等(一样多的不同子图中,然后在节点之间添加边,最后使用Pythonnetworkx库绘制每个边。

对于multidigraph,我尝试了下面的示例代码,但没有添加边,只是为了检查节点形状是否符合要求。在仔细阅读了官方文档后,我只能画一张空白的图(字面意思(。我写的文件也是如此。

我错过了一些基本的东西。欢迎任何指针。

import matplotlib.pyplot as plt
import networkx as nx
import pydot
rn = list()
rn_colmap = []                     # round node color_map
rn_sizmap = []                     # round node
sn = list()
sn_colmap = []                     # square node color_map
sn_sizmap = []                     # square node size_map
g_out = "/whatever/path/to/file_out"
G = nx.MultiDiGraph()
for n_idx in range(len(my_nodes)):
if my_nodes[n_idx] in nodes_A:
rn.append(my_nodes[n_idx])
rn_colmap.append('r')
rn_sizmap.append(300)
else:
sn.append(my_nodes[n_idx])
sn_colmap.append('b')
sn_sizmap.append(600)
rnG = G.subgraph(rn)
snG = G.subgraph(sn)
rn_pos = nx.spring_layout(rnG,iterations=3)
sn_pos = nx.spring_layout(snG,iterations=3)
plt.figure(figsize=(12,12), frameon=False)

nx.draw(rnG,
rn_pos,
node_size = rn_sizmap,
node_color = rn_colmap,
node_shape = 'o',
alpha=0.9,
with_labels = True,
font_size=12,
font_weight='bold',
font_family='sans-serif',
)
nx.draw(snG,
sn_pos,
node_size = sn_sizmap,
node_color = sn_colmap,
node_shape = 's',
alpha=0.9,
with_labels = True,
font_size=12,
font_weight='bold',
font_family='sans-serif',
)
nx.drawing.nx_pydot.write_dot(G, g_out + '.dot')
plt.savefig(g_out + '.png')
nx.write_gml(G,g_out + '.gml.gz')    
plt.show()
G.clear()
plt.close()

我刚刚意识到,在用适当的完整图的感兴趣节点填充子图之前,我需要正确地声明子图。

因此代码变为:

import matplotlib.pyplot as plt
import networkx as nx
import pydot
rn = list()
rn_colmap = []                     # round node color_map
rn_sizmap = []                     # round node
sn = list()
sn_colmap = []                     # square node color_map
sn_sizmap = []                     # square node size_map
g_out = "/whatever/path/to/file_out"
G = nx.MultiDiGraph()
rnG = G.__class__()                # declare/instantiate sub-graphs
snG = G.__class__()
for n_idx in range(len(my_nodes)):
G.add_node(my_nodes[n_idx])    # populate main graph

if my_nodes[n_idx] in nodes_A:
rn.append(my_nodes[n_idx])
rn_colmap.append('r')
rn_sizmap.append(300)
else:
sn.append(my_nodes[n_idx])
sn_colmap.append('b')
sn_sizmap.append(600)
rnG = G.subgraph(rn)
snG = G.subgraph(sn)
# Remaining code is identical to corresponding code section in OP:
rn_pos = nx.spring_layout(rnG,iterations=3)
sn_pos = nx.spring_layout(snG,iterations=3)
plt.figure(figsize=(12,12), frameon=False)
nx.draw(rnG,
rn_pos,
node_size = rn_sizmap,
node_color = rn_colmap,
node_shape = 'o',
alpha=0.9,
with_labels = True,
font_size=12,
font_weight='bold',
font_family='sans-serif',
)
nx.draw(snG,
sn_pos,
node_size = sn_sizmap,
node_color = sn_colmap,
node_shape = 's',
alpha=0.9,
with_labels = True,
font_size=12,
font_weight='bold',
font_family='sans-serif',
)
nx.drawing.nx_pydot.write_dot(G, g_out + '.dot')
plt.savefig(g_out + '.png')
nx.write_gml(G,g_out + '.gml.gz')    
plt.show()
G.clear()
plt.close()

最新更新