Рисование графика или сети из матрицы расстояний? - программирование
Подтвердить что ты не робот

Рисование графика или сети из матрицы расстояний?

Я пытаюсь построить/эскиз (matplotlib или другую библиотеку python) 2D-сеть большой матрицы расстояний, где расстояния будут краями эскизной сети, а строки и столбцы - узлами.

DistMatrix =
[       'a',   'b',     'c',    'd'],
['a',   0,      0.3,    0.4,    0.7],
['b',   0.3,    0,      0.9,    0.2],
['c',   0.4,    0.9,    0,      0.1],
['d',   0.7,    0.2,    0.1,    0] ]

Я ищу эскиз/построение 2d-сети из такой (больше: тысячи столбцов и строк). Матрица расстояния: node 'a' связана с node 'b' глубиной ребра 0,3, узлы 'c' и 'd' будут связаны глубиной ребра 0,1. Какие инструменты/библиотеки я могу использовать (матрица расстояний может быть преобразована в матрицу numpy), чтобы получить эскиз/графическую проекцию такой сети? (pandas, matplotlib, igraph,...?), и некоторые из них делают это быстро (я бы не определил свою собственную функцию Tkinter для этого;-))? спасибо за ваши входящие ответы.

4b9b3361

Ответ 1

Программа graphviz neato пытается уважать длины ребер. doug показывает способ использовать neato с помощью networkx следующим образом:

import networkx as nx
import numpy as np
import string

dt = [('len', float)]
A = np.array([(0, 0.3, 0.4, 0.7),
               (0.3, 0, 0.9, 0.2),
               (0.4, 0.9, 0, 0.1),
               (0.7, 0.2, 0.1, 0)
               ])*10
A = A.view(dt)

G = nx.from_numpy_matrix(A)
G = nx.relabel_nodes(G, dict(zip(range(len(G.nodes())),string.ascii_uppercase)))    

G = nx.drawing.nx_agraph.to_agraph(G)

G.node_attr.update(color="red", style="filled")
G.edge_attr.update(color="blue", width="2.0")

G.draw('/tmp/out.png', format='png', prog='neato')

доходность

enter image description here

Ответ 2

Вы можете использовать пакет networkx, который отлично работает с такими проблемами. Отрегулируйте матрицу, чтобы удалить простой массив numpy следующим образом:

DistMatrix =array([[0,      0.3,    0.4,    0.7],
[0.3,    0,      0.9,    0.2],
[0.4,    0.9,    0,      0.1],
[0.7,    0.2,    0.1,    0] ])

затем импортируйте networkx и используйте его

import networkx as nx
G = G=nx.from_numpy_matrix(DistMatrix)
nx.draw(G)

если вы хотите нарисовать взвешенную версию графика, вы должны указать цвет каждого ребра (по крайней мере, я не смог найти более автоматический способ сделать это):

nx.draw(G,edge_color = [ i[2]['weight'] for i in G.edges(data=True) ], edge_cmap=cm.winter )