python networkx-将断开连接的图形从单个图形保存到单独的文件中

时间:2015-11-13 21:02:19

标签: python python-2.7 networkx digraphs

我有以下程序生成我的图表并将其显示在一个图上。

  

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。

2 个答案:

答案 0 :(得分:1)

我没有完全得到&#39;套装&#39;输入到您的函数或为什么add_edges_from(nodes)使用节点作为输入而不是边缘!因此,为了回答你在两个单独的文件中绘制断开连接的图形的问题,我在没有custom_labels的情况下重现了问题,因为它取决于&#39;集合&#39;输入和我发送Edges2作为节点和集的输入。正如@joel所建议的,我使用weakly_connected_component_subgraphs函数,然后循环函数的输出,分别保存每个图形。因此,最终原始图表保存在 original_graph.png 中,子图分别保存在 graph1.png graph2.png 中。< / p>

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)

原始图 enter image description here

graph1和graph2 enter image description here

由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

这个改进的版本从字典中获取必要的数据。 非常感谢@author的回答

答案 1 :(得分:0)

由于您的图表是定向的,您需要提取图表的强连接组件

graphs = nx.strongly_connected_component_subgraphs(G)

可以找到更多详细信息here
还有一些其他有用的组件方法,您可以找到here