使用networkx从距离矩阵生成图形:不一致性-Python

使用networkx从距离矩阵生成图形:不一致性-Python,python,graph,networkx,distance-matrix,Python,Graph,Networkx,Distance Matrix,我有以下距离矩阵: delta = [[ 0. 0.71370845 0.80903791 0.82955157 0.56964983 0. 0. ] [ 0.71370845 0. 0.99583115 1. 0.79563006 0.71370845 0.71370845] [ 0.80903791 0.99583115 0. 0.90029133 0.811

我有以下距离矩阵:

delta =
[[ 0.          0.71370845  0.80903791  0.82955157  0.56964983  0.          0.        ]
 [ 0.71370845  0.          0.99583115  1.          0.79563006  0.71370845
   0.71370845]
 [ 0.80903791  0.99583115  0.          0.90029133  0.81180111  0.80903791
   0.80903791]
 [ 0.82955157  1.          0.90029133  0.          0.97468433  0.82955157
   0.82955157]
 [ 0.56964983  0.79563006  0.81180111  0.97468433  0.          0.56964983
   0.56964983]
 [ 0.          0.71370845  0.80903791  0.82955157  0.56964983  0.          0.        ]
 [ 0.          0.71370845  0.80903791  0.82955157  0.56964983  0.          0.        ]]
我试图使用networkx库将其表示为一个图形。 这是我的代码:

import networkx as nx

G = nx.from_numpy_matrix(delta) 
pos = nx.random_layout(G) 

plt.figure(figsize=(7, 7))
for k, p in pos.iteritems():
    plt.scatter(p[0], p[1], marker='o', c=colors[k], s=50, edgecolor='None')
lgd = plt.legend(markers, labels, numpoints=1, bbox_to_anchor=(1.17, 0.5))
plt.tight_layout()
plt.axis('equal')
pt.show()
然而,我所看到的并不是我所期望的。例如,考虑这个输出:

delta
,节点1与节点6和7位于同一点,且远离节点4。我在输出图中没有看到。此外,当我运行它时,它会产生另一个输出。这是意料之中的,但距离似乎没有得到尊重。例如,在下图中,1到6、7和4之间的距离发生了变化


我不明白为什么。

您使用的是
nx.random_layout
,它将图形的顶点放置在从均匀分布绘制的随机位置。还有其他布局,例如
nx.spring\u布局
,也称为
nx.fruchterman\u reingold\u布局
,它们尝试定位顶点,使其距离接近给定距离。

您可以使用稍微一致的布局,可能是shell\u布局()或圆形布局()。从技术上讲,在一般的抽象图中,所描述的位置没有实际意义,每次调用这些函数时,它们都会有一点变化,以反映这一事实。它们只是根据一些预定义的模式以合理的方式放置节点

如果你想要一致的位置,你必须自己做

理解布局函数生成的结构,并利用您对数据的理解生成更合理的可视化。这些函数生成一个字典,在节点上键入长度为2的值列表。第一个条目指定节点的x位置,第二个条目指定y位置。
举个例子,办公室之间的网络连接图

pos=nx.spring_layout(G)
print pos
可能会产生类似于

{'A': [1, 12], 'C': [5, 8], 'B': [4, 11], 'E': [8, 3], 'D': [8, 7], 'F': [6, 1]}
但是,我知道,由于我的数据表示citites,因此在表示其物理位置的位置显示节点是有意义的,因此我构建了自己的字典(每个节点已经有一个初始化属性“x”和“y”)


这将以每次相同的方式显示节点。根据矩阵以类似方式创建自己的pos字典。

谢谢,@Culex。
pos = {}
for node in G.nodes():
    pos[node] = [G.node[node]["x"], G.node[node]["y"]]