【问题标题】:directed weighted graph from pandas dataframe来自熊猫数据框的有向加权图
【发布时间】:2018-07-16 15:27:06
【问题描述】:

我有一个包含三列的 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 库。

【问题讨论】:

  • 你能打印 `G.edges(data=True") 吗?它在我的电脑上运行良好。
  • 是的,这确实显示了重量。可能是我没有正确地想象它。如何在网络图上查看边的权重(一种权重标签)?
  • 你可以用其他方法画出来。
  • 别以为我有时间回答这个问题。建议:我认为您的数据中有拼写错误。另外,请通过提供具有预期输出的工作示例来明确您的答案。第三,在正文中编辑它而不是评论。

标签: python-3.x pandas networkx


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多