来自熊猫数据帧的定向加权图

时间:2018-02-06 14:21:03

标签: python-3.x pandas networkx

我有一个pandas数据框(比方说df),它有三列:

src       dst       weight
a         b         2
c         d         7
b         a         5
d         c         1
d         a         3
a         a         4
b         b         1

我想创建一个有向加权图。我尝试了以下但我无法在可视化中获得权重。

G = nx.from_pandas_dataframe(df,source='src', target='dst', edge_attr=['weight'], create_using=nx.DiGraph())
nx.draw_circular(G, with_labels=True)
plt.show()  

有关如何可视化边缘重量的任何建议吗?此外,我有兴趣看到两个节点之间的两个方向的权重(如果存在双向连接)。我也有兴趣可视化以一定重量连接到自身的节点。例如,在样本数据中,节点' a'连接到节点' a'重量为4时,您如何将其视为闭合或环路连接的王者?我正在使用Networkx库。

1 个答案:

答案 0 :(得分:2)

graphviz具有以各种格式呈现复杂图表的各种功能,甚至networkx也有graphviz的插件。有关详细信息,请参阅here

这是通过graphviz使用您的数据生成的简单图表。你可以添加许多铃声和口哨声,如节点,边缘颜色,字体等。 您还可以直接保存为特定的文件格式,包括pdf。

from graphviz import Digraph
import pandas as pd

G = Digraph(format='jpeg')

G.attr(rankdir='LR', size='8,5')
G.attr('node', shape='circle')

df = pd.read_csv('data.txt', sep=",", engine='python')

nodelist = []
for idx, row in df.iterrows():
    node1, node2, weight = [str(i) for i in row]

    if node1 not in nodelist:
        G.node(node1)
        nodelist.append(node2)
    if node2 not in nodelist:
        G.node(node2)
        nodelist.append(node2)

    G.edge(node1,node2, label = weight)

G.render('sg', view=True)

enter image description here