2012-11-22 19 views
15

Mesafeler ve çizgilerin çizgileri ve sütunları arasındaki mesafelerin mesafeler olduğu bir büyük mesafe matrisinin 2D ağını çizmeye/taslaklamaya (matplotlib veya diğer python kitaplığı) çalışıyorum.Bir uzaklık matrisinden bir grafik veya ağ çizme?

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

I kroki Arıyorum/arsa 2d ağ bu gibi (daha büyük sütunlar ve hatların bin) mesafe matrisi: düğüm 'a' 0.3 bir kenar derinliği ile 'b' düğüm bağlanır, 'c' ve 'd' düğümleri 0.1'lik bir kenar derinliği ile bağlanır. Kullanabileceğim araçlar/kütüphaneler (uzaklık matrisi, bu matrisin çizim/grafik projeksiyonunu elde etmek için numpy matrisine dönüştürülebilir) nelerdir? (pandalar, matplotlib, igraph, ...?) ve bazıları bunu çabucak yapmaya yönlendirir (ben kendi Tkinter işlevimi bunu yapmak için ;-); Gelen cevaplarınız için teşekkürler.

+0

Teorik olarak, bu belirli bir mesafe matrislerinin mümkün olabilir verir. Düşünün, ör. Tüm girişlere sahip 4 x 4 mesafe matrisi 1. Bu, üç boyutlu bir simpleks tanımlar. Bu grafiği izometrik olarak iki boyuta yerleştirmenin bir yolu yoktur. Program bu durumda ne yapmalı? – Turion

+0

sağa, yani "kenar uzunluğu" değil, "iki düğümleri birbirine bağlayan kenar derinliği" – sol

cevap

21

graphviz programı neato, kenar uzunluklarına uymak için'u dener. doug shows a way böyle networkx kullanılarak neato koşum:

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

+0

İhtiyaçlarıma göre uyarladığınız kodu denedim (A.view'i kaldırın) ve sadece 7 düğüm için bile çalışmadı. yanlış olan ne olabilir? Ben grafik kullanıyorum 2.36. – Picarus

+1

Bu durumlarda bana hata ''modül' nesne 'to_agraph' özniteliği yoktur.Yapmak için kullanılan http://stackoverflow.com/questions/35279733/what -could-neden-networkx-pygraphviz-to-work-fine-alone-ama-değil-birlikte-ve-kullanılan 'nx.drawing.nx_agraph.to_agraph' – kungfujam

+0

kungfujam: Güncelleme için teşekkürler. – unutbu

14

Bu tür sorunlarla mükemmel şekilde çalışan ağ paketini kullanabilirsiniz. bu gibi basit numpy dizi kaldırmak için matris ayarlayın:

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

sonra networkx ithalat ve Grafiğin ağırlıklı versiyonunu çizmek istiyorsanız bu

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

, belirttiğiniz zorunda kullanmak her kenarının rengi (en azından, bunu yapmak için bir daha otomatik bir yol bulamadım):

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