python 在3D中绘制图形网络

pcww981p  于 2023-06-04  发布在  Python
关注(0)|答案(1)|浏览(184)

假设我是python中的一个给定的有向图:

V = [ 1, 2, 3, 4, 5]
E = { 
1 : [ 2, 3, 4]
2: [ 1, 2, 3]
3 : [1, 4, 5]
4: [5]
5: [1, 3] }
c = [ 81, 23, 43, 22, 100]

V和E分别将图的顶点集和边集表示为列表和字典。并且c是顶点集合上的成本函数,即c(1)= 81,c(2)= 23等。现在我想可视化由(V,E)表示的图,这可以很容易地使用networkx包在2维中完成,但另外我想在变化的z轴上绘制这个图的顶点(而不是仅在xy平面上),以便z轴上每个顶点的“高度”等于其成本。
我怎么能这样做呢?

cwxwcias

cwxwcias1#

给你点东西让你开始。
正如您所指出的,networkx.draw将绘制一个二维图。

点的位置可以从networkx.spring_layout函数中提取(这是调用draw时点的默认布局)。

import networkx
import numpy as np
import itertools as it
import matplotlib.pyplot as plt

g = networkx.Graph(E)

pts = networkx.spring_layout(g)

示例(由于networkx布局函数的随机性,这些点将四处移动):

{1: array([-0.35707887, -0.02227005]),
 2: array([-0.35348547, -1.        ]),
 3: array([ 0.26374451, -0.24148893]),
 4: array([0.56832209, 0.50997504]),
 5: array([-0.12150225,  0.75378394])}

按如下方式提取点:

pts_array = np.array([pt[1] for pt in sorted(list(pts.items()))])

顶点之间的连接可以从E dict中获得,如下所示:

ix_connections = [a for a in it.chain.from_iterable([list(zip(it.repeat(b[0]), b[1])) for b in E.items()])]
[(1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (3, 1), (3, 4), (3, 5), (4, 5), (5, 1), (5, 3)]

因此,我们可以像这样手动绘制图形:

plt.figure()
ax=plt.gca()
ax.plot(*pts_array.T, 'o')
for i,j in ix_connections:
  ax.plot(*pts_array[[i-1,j-1],:].T,'k')

现在,我们可以使用plt.scatter和三维投影轴来绘制高度:

pts_array_z = np.hstack((np.array([pt[1] for pt in sorted(list(pts.items()))]), 
                         np.array(c)[:,np.newaxis]))
fig=plt.figure()
ax=fig.add_subplot(projection='3d')
ax.plot(*pts_array_z.T, 'o')
for i,j in ix_connections:
  ax.plot(*pts_array_z[[i-1,j-1],:].T,'k')

注:这些图不包括顶点2上的循环,您需要自己绘制。此外,这里绘制的图形是无向的,需要为您的有向边包括箭头

相关问题