【问题标题】:Generating graph from distance matrix using networkx: inconsistency - Python使用networkx从距离矩阵生成图:不一致 - Python
【发布时间】:2016-03-31 17:25:28
【问题描述】:

我有以下距离矩阵:

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 之间的距离发生了变化。

我不明白为什么。

【问题讨论】:

    标签: python graph networkx distance-matrix


    【解决方案1】:

    您可以使用稍微一致的布局,可能是 shell_layout() 或 circle_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 字典。

    【讨论】:

    • 谢谢你,@Culex。
    【解决方案2】:

    您正在使用nx.random_layout,它将图形的顶点定位在从均匀分布中抽取的随机位置。还有其他布局,例如nx.spring_layout,又名nx.fruchterman_reingold_layout,尝试定位顶点,使其距离接近给定距离。

    猜你喜欢
    • 2023-03-10
    • 2017-08-02
    • 1970-01-01
    • 2022-09-23
    • 2011-08-08
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多