networkx:绘制多方图时的节点间距

Posted

技术标签:

【中文标题】networkx:绘制多方图时的节点间距【英文标题】:networkx: node spacing when plotting multipartite graph 【发布时间】: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') - 这在类似的例子中对我有用 【参考方案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的格式手动操作位置(尽管它可能效率较低)。

【讨论】:

以上是关于networkx:绘制多方图时的节点间距的主要内容,如果未能解决你的问题,请参考以下文章

构建 NetworkX 图时避免使用 NaN 属性

matplotlib绘制柱状图时,控制间距

使用默认为节点名称的节点标签绘制 networkx 图

NetworkX节点属性绘制

根据节点值为networkx中的节点绘制不同的颜色

使用networkx在两个节点之间绘制多条边