【问题标题】:networkx: node spacing when plotting multipartite graphnetworkx:绘制多方图时的节点间距
【发布时间】:2021-01-26 02:42:10
【问题描述】:

我想使用networkx 绘制一个多重图。但是,当添加更多节点时,情节变得非常拥挤。有没有办法在节点和分区之间留出更多空间?

查看multipartite_layout 的文档,我找不到这个的参数。 当然,可以为位置创建复杂的公式,但由于multipartite_layout 的间距对于小图来说已经很好看,我是如何将其扩展到更大的图。

有没有人知道如何(有效地)做到这一点?

示例代码,生成具有三个分区的图:

import matplotlib.pyplot as plt
import networkx as nx


# build graph:
G = nx.Graph()
for i in range (0,30):
    G.add_node(i,layer=0)
for i in range (30,50):
    G.add_node(i,layer=1)
    for j in range(0,30):
        G.add_edge(i,j)
G.add_node(100,layer=2)
G.add_edge(40,100)

# plot graph
pos = nx.multipartite_layout(G, subset_key="layer",)
plt.figure(figsize=(20, 8))
nx.draw(G, pos,with_labels=False)
plt.axis("equal")
plt.show()

当前拥挤的情节:

【问题讨论】:

  • 尝试删除 plt.axis('equal') - 这在类似的例子中对我有用

标签: python-3.x plot graph nodes networkx


【解决方案1】:

nx.multipartite_layout 返回具有以下格式的字典:{node: array([x, y])}

我建议你试试pos = {p:array_op(pos[p]) for p in pos},其中array_op是作用于每个节点位置的函数array([x, y])

在您的情况下,我认为沿 x 轴进行简单缩放就足够了,即

array_op = lambda x, sx: np.array(x[0]*sx, x[1]).

出于可视化目的,我想这应该与@JPM 的评论等效。但是,这种方法为您提供了获得实际转换位置数据的优势。

最后,如果这样的统一转换不能满足你的需要,你可以随时根据dict的格式手动操作位置(尽管它可能效率较低)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    相关资源
    最近更新 更多