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:绘制多方图时的节点间距的主要内容,如果未能解决你的问题,请参考以下文章