【问题标题】:Drawing massive networkx graph: Array too big绘制海量networkx图:数组太大
【发布时间】:2014-04-07 09:18:00
【问题描述】:

我正在尝试绘制带有加权边的 networkx 图,但现在我遇到了一些困难。

正如标题所示,这张图真的很大:

节点数:103362 边数:1419671

当我尝试使用以下代码绘制此图时:

pos = nx.spring_layout(G)
nx.draw(G, node_color='#A0CBE2',edge_color='#BB0000',width=2,edge_cmap=plt.cm.Blues,with_labels=False)
plt.savefig("edge_colormap.png") # save as png
plt.show() # display

(这只是我测试功能,而不是我想要的最终结果)。我得到了错误:

ValueError: 数组太大。

它是由 spring_layout 算法触发的。知道是什么原因造成的吗?即使我使用不同的 pos 算法,我也会得到相同的错误,我该如何避免它(如果可以的话)?

另一方面,我想根据边缘的重量为边缘着色。正如您所看到的,有很多边,而且权重范围可能很广,最好的方法是什么?

感谢您的耐心等待。

根据我的评论编辑:

我正在尝试调查我拥有的数据的密度。基本上我正在查看 50,000 场比赛,每场比赛包含 10 名球员,每当两名球员在一场比赛中相遇时,我 +1 到他们之间的优势权重。这个想法是我的最终结果将向我展示我的数据集的强度。在我看来,我希望最重的边缘位于中心,当我们从中心移出时,数据的连接密度会降低。

【问题讨论】:

  • 出于好奇,当您绘制具有 100k 个节点的图时,您希望看到什么?我想它会在你的屏幕上变成一大块黑色。
  • 剧情没有实际用处,何必展示呢?
  • 我正在尝试调查我拥有的数据的密度。基本上我正在查看 50,000 场比赛,每场比赛包含 10 名球员,每当两名球员在一场比赛中相遇时,我 +1 到他们之间的优势权重。这个想法是我的最终结果将向我展示我的数据集的强度。编辑:在我看来,我希望最重的边缘位于中心,当我们从中心移出时,数据的连接密度较低。
  • 那么为什么不把节点合并在一起,减少节点的数量以便绘制呢?
  • 对不起,你能说得更具体一点吗?我对编程很陌生,这是我第一次使用这个模块。我不太确定您将节点合并在一起是什么意思。

标签: python networkx large-data


【解决方案1】:

问题在于 spring_layout 方法。有了这么多节点,需要一段时间来计算所有节点应该相对于彼此去哪里。有了这么多节点,我建议要么自己弄清楚 x,y 位置,要么绘制小得多的子图。 (

这是 erdos_renyi_graph(随机选择的边)中的 1000 个节点的样子。

它拉出 2 个节点以突出显示。

接下来是1500的样子 它得到了更多细节。现在有 7-8 个有趣的节点。

图上这么多边和这么多节点并没有什么好处。如果你不喜欢这个输出会发生什么,你需要重新运行它。

要获取每个节点的 x,y 位置,请查看此内容。 in NetworkX show graph with nodes at exact (x,y) position. Result is rotated

【讨论】:

  • 感谢您在此回复中付出的努力,很抱歉我没有尽快回复。我将如何为节点定义自己的位置?我在想我可以使用核心和加权匹配之类的东西来定义与中心节点的径向距离。不过,这听起来很复杂。我已经决定给定我的数据大小,我只想让我的情节给我一个粗略的重量密度指示。所以一种网络,其中最高权重的边缘位于中心。关于我如何制作这个的任何其他想法?
  • 我会想一个不同的方法来解决这个问题。考虑对节点进行分组。您可以将边的权重与其他组相加。首先从一个简单的版本开始,将节点分成两组。
猜你喜欢
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2021-07-27
  • 2013-10-13
  • 2017-07-06
相关资源
最近更新 更多