【问题标题】:networkx plotting directed graphnetworkx 绘制有向图
【发布时间】:2020-11-27 11:48:47
【问题描述】:

我正在尝试使用 networkx 库中的加权边创建一个有向图。如图所示的图表是我试图实现的目标

这是我目前得到的代码

import networkx as nx
import matplotlib.pyplot as plt
import pandas as panda

df = panda.DataFrame({'from':['R','R','D04','D04','D06','D06'], 'to':['D04','D06','R','D06','R','D04']})
    G=nx.from_pandas_edgelist(df, 'from', 'to', create_using=nx.DiGraph()) 


    G['R']['D04']['weight'] = 243.0
    G['R']['D06']['weight'] = 150.0
    G['D06']['D04']['weight'] = 211.0
            

    pos = nx.spring_layout(G)
    labels = nx.get_edge_attributes(G,'weight')
    nx.draw_networkx_edge_labels(G,pos, edge_labels=labels)

    # Make the graph
    nx.draw(G, with_labels=True, node_size=1500, alpha=0.3, font_weight="bold", arrows=True)


    plt.axis('on')
    plt.show()

我得到的图片:

我很难弄清楚如何启用 X/Y 轴。我不知道不同节点的位置,只知道路由器节点('R')应该放在(0,0)中。此外,我的边缘权重似乎是随机放置的。有时它们放置得很好,有时它们会飞走。最后,定向边缘似乎是直的,而不是如所希望的那样弯曲。我读过应该有一个名为“connectionstyle”的属性,但似乎无法让它工作。

【问题讨论】:

    标签: python python-3.x pandas matplotlib networkx


    【解决方案1】:

    问题在于弹簧布局适用于更复杂的网络,您不想控制定位。在这种情况下,您想通过设置固定位置来覆盖节点放置算法(我认为),如下所示:

    import networkx as nx
    import matplotlib.pyplot as plt
    import pandas as panda
    df = panda.DataFrame({'from':['R','R','D04','D04','D06','D06'], 'to':['D04','D06','R','D06','R','D04']})
    G=nx.from_pandas_edgelist(df, 'from', 'to', create_using=nx.DiGraph()) 
    G['R']['D04']['weight'] = 243.0
    G['R']['D06']['weight'] = 150.0
    G['D06']['D04']['weight'] = 211.0
    #pos = nx.spring_layout(G)
    #instead of spring, set the positions yourself
    labelPosDict = {'R':[0.1,0.3], 'D04':[0.5,.9], 'D06':[.9,.18]}
    labels = nx.get_edge_attributes(G,'weight')
    nx.draw_networkx_edge_labels(G,pos=labelPosDict, edge_labels=labels)
    plt.axvline(.1, alpha=0.1, color='green')
    plt.axhline(.3, alpha=0.1, color='green')
    #Create a dict of fixed node positions
    nodePosDict = {'R':[0.1,0.3], 'D04':[0.5,.9], 'D06':[.9,.18]}
    # Make the graph - add the pos and connectionstyle arguments
    nx.draw(G, k=5,with_labels=True, pos=nodePosDict,
            node_size=1500, alpha=0.3, font_weight="bold", arrows=True,
           connectionstyle='arc3, rad = 0.1')
    plt.axis('on')
    plt.show()
    

    通过控制 pos dict,您现在可以将东西准确地放置在您想要的位置,并且它们不会每次都改变(spring 默认使用随机起点,这就是每次布局都会改变的原因)

    【讨论】:

    • 哇,这看起来棒极了!我现在可以通过自己放置节点来理解您的意思。然而,这只是我想正确放置节点的想法。最终目标是根据节点之间的距离来放置节点。边缘权重。你知道这是怎么做的吗?
    • 这个答案似乎是您需要做的事情的目标,即根据距离确定点。 stackoverflow.com/questions/10963054/…
    • 我去看看。祝你有美好的一天,谢谢!
    • 顺便说一句。 nx.draw 函数抱怨“k”变量。删除它会使您的代码运行:)
    • 啊 - 我应该列出我的版本 - networkx: 2.4, matplotlib: 3.2.1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2019-04-01
    • 2021-07-27
    • 2013-10-13
    • 2017-07-06
    相关资源
    最近更新 更多