如何使用CSV文件数据创建图表?

2 投票
1 回答
10586 浏览
提问于 2025-04-18 12:37

我有一个CSV文件,里面有以下数据:

A,B,50
A,C,34
C,D,55
D,D,80
A,D,90
B,D,78

现在我想用A、B、C、D作为节点,第三列的数字作为边来创建一个图。这里的第三列数字表示A和B、A和C等之间共享的共同项。

我打开并读取了这个CSV文件。

Graphs = nx.Graph()

for row in openedfile:
 Graphs.add_node(row[0])
 Graphs.add_edge(row[2])

nx.draw_graphviz(Graphs)

上面的代码给我报了错。我没有得到正确的结果。

1 个回答

5

我不太明白你的文件格式,看起来前两列是表示应该连接的节点,第三列是这个连接的权重。

如果是这样的话,有一种更简单的方法可以把边的CSV文件加载到NetworkX中,那就是使用networkx.read_edgelist这个函数。下面是一个例子,假设你的图存储在一个名为"edges.txt"的文件里:

In [1]: import networkx as nx
In [2]: G = nx.read_edgelist("edges.txt", delimiter=",", data=[("weight", int)]) 
In [3]: G.edges(data=True)
Out[1]: 
[(u'A', u'C', {'weight': 34}),
 (u'A', u'B', {'weight': 50}),
 (u'A', u'D', {'weight': 90}),
 (u'C', u'D', {'weight': 55}),
 (u'B', u'D', {'weight': 78}),
 (u'D', u'D', {'weight': 80})]

需要注意的重要参数是,你需要把每行的分隔符设置为逗号(","),并且要指定第三列的数据是一个整数,应该用"weight"这个键来存储。

然后你可以用权重作为边的标签来绘制你的图,方法如下:

In [4]: edge_labels = dict( ((u, v), d["weight"]) for u, v, d in G.edges(data=True) )
In [5]: pos = nx.random_layout(G)
In [6]: nx.draw(G, pos)
In [7]: nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
In [8]: import matplotlib.pyplot as plt; plt.show()

撰写回答