根据图形权重设置边长的Graphviz布局

4

我想使用networkx来绘制加权图。我使用graphviz_layout生成顶点的位置。我希望在绘图中,边的长度与我使用的边权重成比例。以下是我用来实现这一目标的代码片段:

import networkx as nx
from networkx.drawing.nx_agraph import graphviz_layout

G = nx.Graph()
G.add_weighted_edges_from(edgelist)
pos = graphviz_layout(G)
nx.draw_networkx(G, pos=pos)

这似乎不会影响图中的边长。我看到过这篇帖子,但它只描述了如何向 graphviz_layout 传递所有边的单个默认权重(或者也许我没有理解这个解决方案)。
我该如何更改我的代码片段以绘制边长与边权重成比例的图形?
在上面的代码片段中,edgelist 是一个格式为列表的列表。
edgelist = [[4, 219, 1.414], [4, 7, 3.86]]
1个回答

2
关键是设置边的len属性,如Graphviz文档所述(并适用于Neato)。请注意,这是首选边长,因此您将无法完全控制。例如,您可以像这样向图形G添加单个加权边(u,v,w)
G.add_edge(u, v, len=w)

这里是一个完整的示例,使用佛罗伦萨家族图:

# Load modules
import networkx as nx
from networkx.drawing.nx_agraph import graphviz_layout
import matplotlib.pyplot as plt

# Construct the graph, choosing some edges to be longer
G = nx.generators.social.florentine_families_graph()
lengths = dict()
long_edges = { frozenset(['Salviati', 'Pazzi']),
               frozenset(['Ginori', 'Albizzi']) }
for edge in G.edges():
    if frozenset(edge) in long_edges:
        lengths[edge] = dict(len=2)
    else:
        lengths[edge] = dict(len=1)

nx.set_edge_attributes(G, lengths)

# Plot and show
pos = graphviz_layout(G, prog='neato')
nx.draw_networkx(G, pos=pos)

plt.tight_layout()
plt.show()

为了说明使用边长时的布局差异,这里是我将两个度为1的节点(“Ginori”和“Pazzi”)的两条边设置为更长的结果: Florentine with some longer edges 而这里是不使用任何边长的结果: Florentine with all edges lengths the same

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接