2009-12-05 1193 views
7

我想用我已有的数据可视化一个网络,并且想用特定的边长来绘制它们。我使用Python,并且我尝试过使用networkx和igraph进行绘制,但都似乎分配了固定的边缘长度。networkx/igraph(Python)上的指定边长度

a。)我想知道我是否犯了错误的代码或者软件包没有真正的能力。如何正确实现networkx或igraph的指定边长?

b。)如果networkx和igraph不能这样做,你可能会提出什么包? (最好能携带80万个节点。)

谢谢!

+2

一般情况下,网络/图形绘制程序不会允许您分配固定的边长,因为如果您还修复了边长,则不会绘制所有的图。想想一个边长为1,1,100的三角形。所以如果有一个软件包,它不会是一个通用的图形绘图软件包。要么你的图有一些特别的东西使它成为可能,否则你将不得不自己编程。 – unutbu 2009-12-05 13:42:56

回答

5

这应该工作:

import networkx as NX 
import pygraphviz as PG 

G = PG.AGraph() 
nlist = "A B C D E".split() 
a, b = "A A B", "B C D" 
elist = zip(a.split(), b.split()) 

G.add_nodes_from(nlist) 
G.add_edges_from(elist) 
G.node_attr.update(color="red", style="filled") 
G.edge_attr.update(color="blue", len="2.0", width="2.0") 

print(G.edge_attr) 
# returns {'color': 'red', 'width': '', 'len': '2.0'} 

# add new edge with custom length (all others have length=2.0): 
G.add_edge("C", "E", len="3.0", color="blue", width="2.0") 

edge = G.get_edge("C", "E") 
print(edge_attr) 
# returns {'color': 'blue', 'width': '2.0', 'len': '3.0'} 

# and you can confirm that introspection by drawing & printing this graph: 
G.draw('somefolderandfilename.png', format='png', prog='neato') 

大多数图形绘制算法使用SMACOF,这当然改变边缘长度的某一版本;然而,如果可能的话,graphviz布局引擎'neato'(作为上面'draw'的第二个参数提供)应该保留用户设置的边长。

我在这里使用的库肯定足够坚固,可以处理80,000个节点。