Python:具有不同颜色节点的网络弹簧布局

时间:2014-03-27 06:26:10

标签: python pandas networkx

我创建了一个来自给定节点的最短路径的弹簧布局网络。在这种情况下firm1。我希望每种分离度都有不同的颜色。例如,连接firm1和其他公司的所有第一条边,比如firm2firm3,我想更改firm2和{{1}的节点颜色(两者颜色相同)。然后,从firm3firm2连接的所有公司,说firm3firm4我想更改其节点颜色。但我不知道如何从firm5开始为每个分离程度更改节点的颜色。这是我的代码:

firm1

如何为每个分离度设置不同的颜色节点?换句话说,import networkx as nx import matplotlib.pyplot as plt import pandas as pd graph = nx.Graph() with open('C:\\file.txt') as f: #Here, I load a text file with two columns indicating the connections between each firm for line in f: tic_1, tic_2 = line.split() graph.add_edge(tic_1, tic_2) paths_from_1 = nx.shortest_path(graph, "firm1") #I get the shortest path starting from firm1 x = pd.DataFrame(paths_from_1.values()) #I convert the dictionary of the shortest path into a dataframe tic_0=x[0].tolist() #there are 7 columns in my dataframe x and I convert each columns into a list. tic_0 is a list of `firm1` string tic_1=x[1].tolist() #tic_1 is list of all the firms directly connected to firm1 tic_2=x[2].tolist() #tic_2 are the firms indirectly connected to firm1 via the firms in tic_1 tic_3=x[3].tolist() #and so on... tic_4=x[4].tolist() tic_5=x[5].tolist() tic_6=x[6].tolist() l = len(tic_0) graph = nx.Graph() for i in range(len(tic_0)): graph.add_edge(tic_0[i], tic_1[i]) graph.add_edge(tic_1[i], tic_2[i]) graph.add_edge(tic_2[i], tic_3[i]) graph.add_edge(tic_3[i], tic_4[i]) graph.add_edge(tic_4[i], tic_5[i]) graph.add_edge(tic_5[i], tic_6[i]) pos = nx.spring_layout(graph_short, iterations=200, k=) nx.draw(graph_short, pos, font_size='6',) plt.savefig("network.png") plt.show() 中的所有公司都应该有一个蓝色的节点,tic_1中的所有公司都有黄色节点颜色等。

1 个答案:

答案 0 :(得分:5)

执行此操作的一般方法是从源节点运行最短路径长度算法以分配颜色。这是一个例子:

import matplotlib.pyplot as plt
import networkx as nx

G = nx.balanced_tree(2,5)
length = nx.shortest_path_length(G, source=0)
nodelist,hops = zip(*length.items())
positions = nx.graphviz_layout(G, prog='twopi', root=0)
nx.draw(G, positions, nodelist = nodelist, node_color=hops, cmap=plt.cm.Blues)
plt.axis('equal')
plt.show()

enter image description here

您可以使用

positions = nx.spring_layout(G)

代替。我使用了graphviz circo布局,因为它在绘制我使用的平衡树方面做得更好。