python networkx- 将断开连接的图形从单个图形保存到单独的文件中
python networkx- save disconnected graphs from single figure into separate files
我有以下程序可以生成我的图形并将其显示在单个图形上。
Edges2 = [(1, 2), (1, 3), (1, 4), (4, 5), (6, 7), (6,8)]
G = nx.DiGraph()
生成图的函数如下:
def create_graph(G,nodes,Sets):
G.add_edges_from(nodes)
#value assigned to each world
custom_labels={}
custom_node_sizes={}
node_colours=['y']
for i in range(0, len(Sets)):
custom_labels[i+1] = Sets[i]
custom_node_sizes[i+1] = 5000
if i < len(Sets):
node_colours.append('b')
nx.draw(G,labels=custom_labels,node_list = nodes,node_color=node_colours, node_size=custom_node_sizes.values())
#show with custom labels
plt.show()
我正在向上述函数传递边列表 (Edges2)。
该函数在单个图窗上生成两个断开连接的图。不过,我想把这两张图分开保存。
所以基本上,有没有办法将两个断开连接的图形保存到两个文件中?所以,我可以得到 graph1.png 和 graph2.png.
由于您的图是定向,您需要提取图的强连通分量:
graphs = nx.strongly_connected_component_subgraphs(G)
我不太明白你函数的 'Sets' 输入,或者你为什么 add_edges_from(nodes)
使用节点而不是边作为输入!。因此,为了回答您在 2 个单独的文件中绘制断开连接的图形的问题,我在没有 custom_labels 的情况下重现了该问题,因为它取决于 'Sets' 输入,并且我也将 Edges2 作为节点和集合的输入发送。正如@joel 所建议的,我使用了 weakly_connected_component_subgraphs
函数,然后循环函数的输出,分别保存每个图形。所以最后原图保存在 original_graph.png ,子图保存在 graph1.png 和 graph2.png分别.
def create_graph(G,nodes,Sets):
G.add_edges_from(nodes)
#value assigned to each world
custom_labels={}
custom_node_sizes={}
node_colours=['y']
for i in range(0, len(Sets)):
custom_labels[i+1] = Sets[i]
custom_node_sizes[i+1] = 5000
if i < len(Sets):
node_colours.append('b')
nx.draw(G,node_list = nodes,node_color=node_colours, node_size=1000, with_labels = True)
plt.savefig("original_graph.png")
plt.show()
G_comp = nx.weakly_connected_component_subgraphs(G)
i = 1
for comp in G_comp:
nx.draw(comp,node_color=node_colours, node_size=1000, with_labels=True)
#show with custom labels
fig_name = "graph" + str(i) + ".png"
plt.savefig(fig_name)
plt.show()
i += 1
Edges2 = [(1, 2), (1, 3), (1, 4), (4, 5), (6, 7), (6,8)]
G = nx.DiGraph()
create_graph(G,Edges2,Edges2)
原图
图 1 和图 2
AKI 编辑:
我已经添加了我需要的标签(见评论)。代码的最后一部分是:
i = 1
custom_number = 1;
for comp in G_comp:
dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ])
wanted_keys = (range(custom_number,custom_number + len(comp)))
newdict = dictfilt(custom_labels, wanted_keys)
nx.draw(comp,node_color=node_colours, node_size=1000, with_labels=True, labels = newdict)
#show with custom labels
fig_name = "graph" + str(i) + ".png"
plt.savefig(fig_name)
plt.show()
custom_number += len(comp)
i += 1
这个改进版本从字典中提取必要的数据。
非常感谢@作者的回答
我有以下程序可以生成我的图形并将其显示在单个图形上。
Edges2 = [(1, 2), (1, 3), (1, 4), (4, 5), (6, 7), (6,8)]
G = nx.DiGraph()
生成图的函数如下:
def create_graph(G,nodes,Sets):
G.add_edges_from(nodes)
#value assigned to each world
custom_labels={}
custom_node_sizes={}
node_colours=['y']
for i in range(0, len(Sets)):
custom_labels[i+1] = Sets[i]
custom_node_sizes[i+1] = 5000
if i < len(Sets):
node_colours.append('b')
nx.draw(G,labels=custom_labels,node_list = nodes,node_color=node_colours, node_size=custom_node_sizes.values())
#show with custom labels
plt.show()
我正在向上述函数传递边列表 (Edges2)。 该函数在单个图窗上生成两个断开连接的图。不过,我想把这两张图分开保存。
所以基本上,有没有办法将两个断开连接的图形保存到两个文件中?所以,我可以得到 graph1.png 和 graph2.png.
由于您的图是定向,您需要提取图的强连通分量:
graphs = nx.strongly_connected_component_subgraphs(G)
我不太明白你函数的 'Sets' 输入,或者你为什么 add_edges_from(nodes)
使用节点而不是边作为输入!。因此,为了回答您在 2 个单独的文件中绘制断开连接的图形的问题,我在没有 custom_labels 的情况下重现了该问题,因为它取决于 'Sets' 输入,并且我也将 Edges2 作为节点和集合的输入发送。正如@joel 所建议的,我使用了 weakly_connected_component_subgraphs
函数,然后循环函数的输出,分别保存每个图形。所以最后原图保存在 original_graph.png ,子图保存在 graph1.png 和 graph2.png分别.
def create_graph(G,nodes,Sets):
G.add_edges_from(nodes)
#value assigned to each world
custom_labels={}
custom_node_sizes={}
node_colours=['y']
for i in range(0, len(Sets)):
custom_labels[i+1] = Sets[i]
custom_node_sizes[i+1] = 5000
if i < len(Sets):
node_colours.append('b')
nx.draw(G,node_list = nodes,node_color=node_colours, node_size=1000, with_labels = True)
plt.savefig("original_graph.png")
plt.show()
G_comp = nx.weakly_connected_component_subgraphs(G)
i = 1
for comp in G_comp:
nx.draw(comp,node_color=node_colours, node_size=1000, with_labels=True)
#show with custom labels
fig_name = "graph" + str(i) + ".png"
plt.savefig(fig_name)
plt.show()
i += 1
Edges2 = [(1, 2), (1, 3), (1, 4), (4, 5), (6, 7), (6,8)]
G = nx.DiGraph()
create_graph(G,Edges2,Edges2)
原图
图 1 和图 2
AKI 编辑: 我已经添加了我需要的标签(见评论)。代码的最后一部分是:
i = 1
custom_number = 1;
for comp in G_comp:
dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ])
wanted_keys = (range(custom_number,custom_number + len(comp)))
newdict = dictfilt(custom_labels, wanted_keys)
nx.draw(comp,node_color=node_colours, node_size=1000, with_labels=True, labels = newdict)
#show with custom labels
fig_name = "graph" + str(i) + ".png"
plt.savefig(fig_name)
plt.show()
custom_number += len(comp)
i += 1
这个改进版本从字典中提取必要的数据。 非常感谢@作者的回答