tiempo suavizar real polar matrices graficos grafico graficas graficar grafica barras python graph plot social-networking

python - suavizar - ¿Dibujar un gráfico o una red desde una matriz de distancias?



python graficos 2d (2)

Estoy intentando trazar / dibujar (matplotlib u otra biblioteca de python) una red 2D de una gran matriz de distancia donde las distancias serían los bordes de la red esbozada y la línea y la columna de sus nodos.

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] ]

Estoy buscando dibujar / trazar la red 2d desde dicha matriz de distancia (más grande: miles de columnas y líneas): el nodo ''a'' está vinculado al nodo ''b'' por una profundidad de borde de 0,3, los nodos ''c'' y ''d ''sería atado por una profundidad de borde de 0.1. ¿Cuáles son las herramientas / bibliotecas que puedo usar (la matriz de distancia se puede convertir en una matriz numpy) para obtener el boceto / proyección gráfica de dicha red? (pandas, matplotlib, igraph, ...?) y algunas pistas para hacer eso rápidamente (no definiría mi propia función Tkinter para hacer eso ;-))? gracias por sus respuestas entrantes


El programa graphviz neato trata de respetar las longitudes de los bordes. doug muestra una manera de aprovechar neato usando networkx de esta manera:

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'')

rendimientos

Si desea generar un archivo de puntos, puede hacerlo usando

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

cuyos rendimientos

strict graph { graph [bb="0,0,226.19,339.42"]; node [color=red, label="/N", style=filled ]; edge [color=blue, width=2.0 ]; B [height=0.5, pos="27,157.41", width=0.75]; D [height=0.5, pos="69,303.6", width=0.75]; B -- D [len=2.0, pos="32.15,175.34 40.211,203.4 55.721,257.38 63.808,285.53"]; A [height=0.5, pos="199.19,18", width=0.75]; B -- A [len=3.0, pos="44.458,143.28 77.546,116.49 149.02,58.622 181.94,31.965"]; C [height=0.5, pos="140.12,321.42", width=0.75]; B -- C [len=9.0, pos="38.469,174.04 60.15,205.48 106.92,273.28 128.62,304.75"]; D -- A [len=7.0, pos="76.948,286.17 100.19,235.18 167.86,86.729 191.18,35.571"]; D -- C [len=1.0, pos="94.274,309.94 100.82,311.58 107.88,313.34 114.45,314.99"]; A -- C [len=4.0, pos="195.67,36.072 185.17,90.039 154.1,249.6 143.62,303.45"]; }

El archivo png podría entonces generarse usando el programa graphviz neato :

neato -Tpng -o /tmp/out.png /tmp/out.dot


Puede utilizar el paquete networkx, que funciona perfectamente con este tipo de problemas. Ajusta tu matriz para eliminar una simple matriz numpy como esta:

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] ])

luego importa networkx y úsalo

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

Si desea dibujar una versión ponderada del gráfico, debe especificar el color de cada borde (al menos, no pude encontrar una forma más automatizada de hacerlo):

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