Python:从数据绘制网络图

2 投票
2 回答
518 浏览
提问于 2025-04-17 23:46

我有一个这样的数据集:

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()

撰写回答