【问题标题】:Why does networkx redraw my graph different each run?为什么networkx每次运行都会重绘我的图表?
【发布时间】:2018-12-12 01:30:09
【问题描述】:

我想用边表示节点之间的相关系数来绘制图表。我对每一种独特的关系都有优势。每次我重新运行以下代码时,图表都会有所不同。有没有办法强制一种形式的图表?此外,不确定这是否正确生成了图表 - 请帮助解决任何看起来错误的问题。

G = nx.Graph()
G.add_edge('A', 'B', weight=0.511012)
G.add_edge('A', 'C', weight=0.553063)
G.add_edge('A', 'D', weight=0.607859)
G.add_edge('A', 'E', weight=0.601554)
G.add_edge('A', 'F', weight=0.641796)

G.add_edge('B', 'C', weight=0.438743)
G.add_edge('B', 'D', weight=0.463087)
G.add_edge('B', 'E', weight=0.615150)
G.add_edge('B', 'F', weight=0.478853)

G.add_edge('C', 'D', weight=0.553063)
G.add_edge('C', 'E', weight=0.438743)
G.add_edge('C', 'F', weight=0.541893)

G.add_edge('D', 'E', weight=0.535331)
G.add_edge('D', 'F', weight=0.556995)

G.add_edge('E', 'F', weight=0.535446)

nx.draw(G, with_labels=True, node_color='orange', node_size=400, edge_color='black', linewidths=1, font_size=15)
plt.show()

【问题讨论】:

    标签: python networkx graph-theory


    【解决方案1】:

    nx.draw 默认使用nx.spring_layout 设置节点的位置。除非将种子输入nx.spring_layout,否则它会从随机初始条件开始,然后使用基于将边缘视为弹簧和节点视为质量的运动来重新定位节点。由于这种随机的初始条件,每次的位置都会不同。

    但是,通常我们可能想要使用多个绘图命令来绘制节点或边(例如,如果我们想要一种尺寸或样式的一些节点和另一种尺寸或样式的其他节点)。为此,nx.draw 接受一个可选参数pos,它是一个字典,其键是节点,其值是 2 元组,给出它们的 (x,y) 坐标。 Networkx 有几个使用不同规则分配位置的函数,正如我上面所说,默认使用随机初始条件,因此每次都会给出不同的输出。

    在您的情况下,您希望确保每次运行代码时网络都处于相同的位置。所以你应该给设置位置的命令提供一个种子。

    #code to generate graph G here.
    my_pos = nx.spring_layout(G, seed = 100)
    nx.draw(G, pos = my_pos, with_labels=True, node_color='orange', node_size=400, edge_color='black', linewidths=1, font_size=15)
    plt.show()
    

    可以允许边缘的权重使弹簧布局发挥作用,就好像更高的权重是更强的弹簧一样。查看documentation of spring_layout了解更多详情。

    【讨论】:

    • 谢谢!使用nx.spring_layout(G, random_state=2) 修复了初始化。但是,密度和平均最短路径始终为 1,这让我认为该图没有适当地使用我的权重。或者,我使用 G = nx.from_pandas_edgelist(res, source='var1', target='var2', edge_attr='weight') 从具有相同数据的数据框构建图形,因此我可以指定 edge_attr,并且我仍然得到密度和平均最短路径等于 1。
    • 它不使用权重的原因是spring_layout 命令不知道这样做(您需要先提供一个可选参数)。更多信息请查看stackoverflow.com/q/29797990/2966723
    • 我通过输入每个边的权重 {'weight': 0.4} 得到了正确的图表。在试图弄清楚这一点时,我用from_pandas_edgelist 重写了从数据帧中读取的内容,但无法正确渲染权重,可能是因为我无法格式化单个字典中的权重值。你有什么建议让它与from_pandas_edgelist一起工作吗?
    【解决方案2】:

    您的代码构建了一个完整的图表。 NetworkX 不负责它可视化图形的方式,而是您使用的下划线库; matplotlib 在这种情况下。您可以检查是否可以通过该库定义一些原语,以便以某种方式为每次运行保持相同的图形。

    另外,请记住,NetworkX 不是 documentation 的图形可视化工具。

    NetworkX 提供了可视化图形的基本功能,但它的 主要目标是启用图形分析而不是执行图形 可视化。未来,图形可视化功能可能 从 NetworkX 中移除或仅作为附加包提供。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2018-02-12
      • 2021-06-23
      • 2016-05-09
      • 1970-01-01
      相关资源
      最近更新 更多