【问题标题】:Alter edge length and cluster spacing in networkx/matplotlib force graph在 networkx/matplotlib 力图中改变边长和簇间距
【发布时间】:2018-06-22 17:28:35
【问题描述】:

我正在尝试使用 python 来输出使用 networkx 和 matplotlib 的力图的 PNG。这是它目前的样子:

节点重叠很多,边长很短,簇很稀疏。

如果我使用 d3.js 可视化相同的图表,会发生以下情况(忽略不同的颜色、边缘权重和箭头,我试图重现):

如您所见,这更“清晰”且视觉上更吸引人,因为节点间距更好,集群更靠近,留下的空白空间更少。

尽管阅读了我可以在这里找到的每个主题,并尝试了几十次迭代,包括节点大小、图形大小、边权重和边 length 属性(这似乎没有任何作用,但这可能是因为它是任意属性),我无法使 matplotlib 图看起来像 d3.js 的图,即使两个图都是使用完全相同的节点、节点大小和边创建的。

不幸的是,在 d3.js 中创建它们并不是一个真正的选择,因为我希望创建数以万计的静态 PNG,而且我真的不喜欢在浏览器中渲染它们然后截图它们!

所以,我的问题是:是否有 (a) 一种改进 matplotlib 布局的方法(通过使边缘更长,和/或避免节点重叠,和/或减少空白),(b) 一种方法将 d3.js 力图输出为 PNG(或任何静态格式),或者 (c) 另一个我可以用来将格式更好的力图输出为图像的库?

【问题讨论】:

  • 更新:我已经尝试了iterations 参数,它显示了我认为图表动画中的不同点,例如:pos = nx.spring_layout(G, iterations=100) nx.draw(G, pos)可能有用,但我不完全确定如何计算出对于不同大小的图来说理想的迭代次数......而且,d3.js 再次自动完成这一切。
  • 另外,我很想知道为什么有人反对这篇文章,因为它非常清楚地概述了问题和问题!

标签: python d3.js matplotlib graph networkx


【解决方案1】:

我找到了一种方法来完成这项工作,使用graphviz_layout() 而不是spring_layout()(感谢here 的提示)。这需要安装一些额外的库,因此我将记录我所做的(在 Ubuntu 16.04 上)以防其他人遇到类似问题。

要使用graphviz_layout(),您必须先导入它(from networkx.drawing.nx_agraph import graphviz_layout)。但是,您还需要安装pygraphviz,它似乎没有作为依赖项安装。

要以 NetworkX 可以看到的方式安装 pygraphviz,我需要执行以下操作(感谢 this thread 上的帖子):

sudo pip install pygraphviz --install-option="--include-path=/usr/include/graphviz" --install-option="--library-path=/usr/lib/graphviz/"

graphviz_layout() 的可视化似乎比spring_layout() 具有更少的节点重叠,以及总体上更美观的间距。请参阅下面的输出(与问题帖子中的第一张图片相比):

working networkx/matplotlib/pygraphviz force graph

这花了很多时间才弄好,所以我希望它对其他有类似要求的人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 2019-07-11
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多