networkx/igraph (Python) 上的指定边长
Posted
技术标签:
【中文标题】networkx/igraph (Python) 上的指定边长【英文标题】:Specified edge lengths on networkx/igraph (Python) 【发布时间】:2009-12-05 06:06:49 【问题描述】:我想用我拥有的数据来可视化一个网络,并想用特定的边长来绘制它们。我使用 Python,并且尝试使用 networkx 和 igraph 进行绘图,但似乎都指定了固定的边长。
a.) 我想知道是我做错了代码还是这些软件包真的没有能力。如何正确实现 networkx 或 igraph 的指定边长?
b.) 如果 networkx 和 igraph 不能做到这一点,你可能会建议什么包? (最好能承载8万以上节点)
谢谢!
【问题讨论】:
一般网络/图形绘图程序不允许您指定固定边长,因为如果您还固定边长,则并非所有图形都可以绘制。想象一个边长为 1,1,100 的三角形。所以如果有一个包,它就不是一个通用的绘图包。要么你的图表有什么特别之处使它成为可能,要么你必须自己编程。 【参考方案1】:这应该可行:
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", )
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", )
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 个节点。
【讨论】:
你能展示如何用graphviz包而不是pygraphviz做同样的事情吗? 上述答案不如@doug 承诺的那么好。这个“graphviz 布局引擎 'neato' 应该尽可能保留用户设置的边长。”根本不是真的。我创建了几个最小生成树图,其中用户给定的长度完全可以保留,但它仍然没有。当有多个节点(例如 +30)时,该问题尤其明显。尽管如此,这是迄今为止我发现的最好的 Python 算法。以上是关于networkx/igraph (Python) 上的指定边长的主要内容,如果未能解决你的问题,请参考以下文章