我有以下距离矩阵:
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之间的距离发生了变化。
我无法理解为什么。
答案 0 :(得分:1)
您正在使用nx.random_layout
,它将图表的顶点定位在从均匀分布中绘制的随机位置。还有其他布局,例如nx.spring_layout
,又称nx.fruchterman_reingold_layout
,尝试定位顶点,使其距离接近给定距离。
答案 1 :(得分:1)
您可以使用稍微更一致的布局,可能是shell_layout()或circular_layout()。从技术上讲,在一般的抽象图中,所描绘的位置没有实际意义,并且每次将这些函数称为对该事实的反映时,这些函数中的每一个都会有一点变化。它们只是根据某种预定义的模式以合理的方式放置节点。
如果你想要一致的位置,你必须自己做。
了解布局功能产生的结构,并使用您对数据的理解来产生更明智的可视化。这些函数生成一个键入节点的字典,其值为长度为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 = {}
for node in G.nodes():
pos[node] = [G.node[node]["x"], G.node[node]["y"]]
每次都以相同的方式显示节点。根据您的矩阵以类似的方式创建您自己的 pos 字典。