networkx:一致性绘制图形

2 投票
1 回答
1751 浏览
提问于 2025-04-18 07:39

我正在使用networkx绘制3D立方体、4D超立方体和5D超立方体。

我想知道如何控制draw()这个函数的工作方式?我希望它们都能以完全相同的角度、大小和标签显示出来。

cnt = 0
for uniqHC in nx_hcl:
    plt.figure()
    nx.draw(uniqHC)
    plt.savefig("uniqHC_" + str(cnt))
    plt.close()
    #nx.relabel_nodes(uniqHC, flatten)
    cnt += 1

如你所见,第一个图看起来还不错,但第二个图就不是我想要的。它太难理解了,比较起来也很麻烦。这只是3D的情况。

enter image description here

enter image description here

这个软件可以绘制超立方体,而且效果很好。我希望我的图表能以相同的风格绘制。下面是我想要的3D图的样子。我的标签用'000'、'001'这样的方式就可以了。我尝试过一些聪明的方法,从他们的超立方体开始,去掉有向边,然后添加我的方向,但这样会随机扭曲图形的形状,结果看起来还是和之前一样!

HC = nx.hypercube_graph(3)
DHC = nx.convert.convert_to_directed(HC)
nx.draw(HC)

enter image description here

1 个回答

1

你可能会发现,使用networkx中的弹簧布局方法,无法得到你想要的结果(比如节点的方向和间距总是一致的)。这个弹簧布局是默认的,当你调用draw()时就是在使用这个方法。

如果你知道想要把节点放在哪里,可以像下面这样精确指定它们的位置:

In [1]: import networkx as nx

In [2]: G = nx.hypercube_graph(2)

In [3]: pos = nx.spring_layout(G)

In [4]: pos
Out[4]: 
{(0, 0): array([ 0.67137792,  0.44182572]),
 (0, 1): array([ 0.42261686,  1.        ]),
 (1, 0): array([ 0.24869904,  0.        ]),
 (1, 1): array([ 0.        ,  0.55858863])}

In [5]: pos[(0,0)]=(0,0)

In [6]: pos[(0,1)]=(0,1)

In [7]: pos[(1,0)]=(1,0)

In [8]: pos[(1,1)]=(1,1)

In [9]: nx.draw(G,pos)

enter image description here

撰写回答