Создание графа из матрицы расстояний с использованием networkx: несогласованность - Python

У меня есть следующая матрица расстояний:

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.

введите описание изображения здесь

Я не могу понять почему.


person pceccon    schedule 31.03.2016    source источник


Ответы (2)


Вы можете использовать более согласованный макет, например, shell_layout () или round_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 аналогичным образом на основе вашей матрицы.

person Culex    schedule 27.04.2016
comment
Спасибо, @Culex. - person pceccon; 27.04.2016

Вы используете nx.random_layout, который размещает вершины графа в случайных положениях, взятых из равномерного распределения. Существуют и другие макеты, такие как nx.spring_layout, он же nx.fruchterman_reingold_layout, которые пытаются расположить вершины так, чтобы их расстояния приблизительно соответствовали заданным расстояниям.

person A.P.    schedule 31.03.2016
comment
stackoverflow.com/ questions / 36318742 / - person pceccon; 31.03.2016