绘制大型networkx图:数组太大

3 投票
1 回答
5894 浏览
提问于 2025-04-18 01:41

我正在尝试用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算法引发的。你知道是什么原因吗?即使我使用不同的布局算法,还是会出现同样的错误,我该如何避免这个问题(如果可以的话)?

另外,我想根据边的权重来给它们上色。正如你所看到的,边的数量很多,权重范围也可能很广,最好的做法是什么呢?

谢谢你的耐心。

我在评论中补充:

我正在尝试调查我数据的密度。基本上,我在查看50,000场比赛,每场比赛有10名玩家,每当两名玩家在比赛中相遇时,我就把它们之间的边的权重加1。我的想法是,最终结果能显示出我的数据集的强度。在我心中,我希望最重的边在中心,随着我们从中心向外移动,数据的连接就会变得稀疏。

1 个回答

3

问题出在使用spring_layout这个方法上。因为节点太多了,计算它们之间的位置会花费一些时间。如果节点数量这么多,我建议你要么自己计算每个节点的x和y坐标,要么把图分成更小的子图来画。(最好少于5000个节点,不然你的电脑可能会变得有点慢。)

这是一个包含1000个节点的erdos_renyi_graph(随机选择的边)效果图。enter image description here

图中突出了两个节点。

接下来是1500个节点的效果图:enter image description here 这次细节多了一些,现在有7到8个有趣的节点。

在图中有这么多边和节点,其实收获不大。如果你对结果不满意,还得重新运行一遍。

如果你想获取每个节点的x和y坐标,可以看看这个链接:在NetworkX中显示节点在确切的(x,y)位置,结果是旋转的

撰写回答