不能在Python中使用Networkx绘制图形

时间:2016-11-28 18:50:55

标签: python networkx

我有以下格式的CSV文件,

A,B,23
C,D,21
D,B,12

其中每个节点代表一个站,权重代表它们之间的运行时间。 我需要使用networkx构建一个图形,其中节点作为工作站,并且运行时间作为它们之间的边缘。 我创建了一个多级字典,格式如下

{'A': {'B': '29'}, 'C': {'D': '26'},'C': {'B': '12'} 

我无法创建图表并使用Networkx绘制它。

创建图表后,我还将应用Dijstra算法找到最短路径

我的CSV文件中共有1500行,我将其转换为字典。还有其他有效的方法吗?

1 个答案:

答案 0 :(得分:0)

您不能将数据放在{'A': {'B': '29'}, 'C': {'D': '26'}, 'C': {'B': '12'}}这样的字典中,因为密钥不是唯一的(您有C两次密钥)。我建议改用2D列表,例如'A': {'B': '29'}将成为['A', 'B', '29']

我假设您的图表是无向的(边缘A-> B与B-> A相同)并且您在两个节点之间没有更多的边缘。

这是我的示例,只有3个边,我绘制节点(及其名称)和边(及其权重)。我还将权重转换为数值,因为您声明将在图表上进行计算。

import networkx as nx
import matplotlib.pyplot as plt

data = [
    ['A', 'B', '29'],
    ['C', 'D', '26'],
    ['C', 'B', '12']
]

G = nx.Graph()  # new empty undirected graph

for row in data:
    src_node = row[0]
    dest_node = row[1]
    weight = float(row[2])  # convert weight to a number
    G.add_edge(src_node, dest_node, weight=weight)

pos = nx.spring_layout(G)  # compute graph layout
nx.draw(G, pos, node_size=700)  # draw nodes and edges
nx.draw_networkx_labels(G, pos)  # draw node labels/names
# draw edge weights
labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
# show image
plt.show(G)

输出: enter image description here

请注意,如果您有大量节点和边缘(图像可能也会混乱),Python可能需要一段时间才能绘制图形。值得一提的是,使用spring_layout布局功能,每次运行代码时都可以获得不同的图像。