Python:从数据绘制网络图
我有一个这样的数据集:
firm_id_1 firm_id_2
1 2
1 4
1 5
2 1
2 3
3 2
3 6
4 1
4 5
4 6
5 4
5 7
6 3 ....
我想画出一个网络图,专门展示firm_id = 1
的连接情况。简单来说,我想看到一个图,显示firm_id = 1
直接连接到2、4、5,同时通过公司2间接连接到3,通过公司4连接到6,再通过公司5间接连接到7。也就是说,我想从firm_id=1
开始,画出到每个节点(firm_id)的最短距离。我的数据里有3000个节点,我知道公司1可以在少于9个节点的情况下到达所有节点。我该如何在Python中画出这个图呢?
2 个回答
1
你可以试试这个叫做 python-graph 的工具包。我不太确定它的扩展性如何,但你可以这样做...
from pygraph.classes.digraph import digraph
from pygraph.algorithms.minmax import shortest_path
gr= digraph()
gr.add_nodes(range(1,num_nodes))
for i in range(num_edges):
gr.add_edge((edge_start, edge_end))
# shortest path from the node 1 to all others
shortest_path(gr,1)
1
我建议你从一个叫做 NetworkX 的库开始。虽然我不太确定你具体想要什么,但我觉得这个库应该能帮你做一些修改。
这个程序会从一个名为 graphdata.txt 的文本文件中加载数据,数据之间用空格分开,然后把这些数据对作为边添加到图中。
接着,它会计算从节点1到所有其他节点的最短路径,并打印出如果距离大于9的情况……想了解更多细节可以查看 文档。
最后,它会使用弹簧布局把图形渲染到一个叫做 mynetwork.png 的文件里,并在屏幕上显示出来。
对于3000个节点,可能需要一些优化,也可能不需要。
希望这能帮到你!
import networkx as nx
import matplotlib.pyplot as plt
graph = nx.Graph()
with open('graphdata.txt') as f:
for line in f:
firm_id_1, firm_id_2 = line.split()
graph.add_edge(firm_id_1, firm_id_2)
paths_from_1 = nx.shortest_path(graph, "1")
for path in paths_from_1:
if len(paths_from_1[node]) > 9:
print "Shortest path from 1 to", node, "is longer than 9"
pos = nx.spring_layout(graph, iterations=200)
nx.draw(graph, pos)
plt.savefig("mynetwork.png")
plt.show()