2016-11-28 42 views
0

我有CSV文件在下面的格式,不能散点图使用Networkx在Python

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

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

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

我已经无法创建图形和使用Networkx绘制。

创建图表后我也将申请Dijstra算法找到最短路径

我共有1500行我的CSV文件从我转换成字典。有没有其他有效的方法来做到这一点?

+1

你可以缩小这个单一的问题,并解释你所尝试的? – Joel

+0

你是如何尝试创建图表的,出了什么问题?请提供[mcve]。 –

+0

这是我的用于通过CSV文件读取,使多级词典 my_dict = {} 张开( 'final_graph.csv')作为f_input代码:在csv.reader 为行(f_input): my_dict [行[0]] = {row [1]:row [2]} 我想将my_dict转换为具有所有节点和边的可见网络图 –

回答

0

因为密钥不是唯一的(您有两次作为密钥),所以不能将数据存储在类似{'A': {'B': '29'}, 'C': {'D': '26'}, 'C': {'B': '12'}}的字典中。我建议使用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布局功能,您可以在每次运行代码时获得不同的图像。