gpt4 book ai didi

python - 根据 graphviz_layout 中的权重设置边长

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:47 32 4
gpt4 key购买 nike

我正在尝试使用 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)

这似乎不会影响绘图中的边长。我看过this post然而,它仅描述了如何将所有边的单个默认权重传递给 graphviz_layout(或者我可能还没有理解该解决方案)。

如何更改我的代码片段以绘制长度与边权重成正比的图形?

在上面的代码片段中,edgelist 是这种格式的列表列表:

edgelist = [[4, 219, 1.414], [4, 7, 3.86]]

最佳答案

关键是设置边缘的 len 属性,如 Graphviz docs 中所述(并且适用于 Neato)。请注意,这是一个首选边长,因此您无法完全控制。例如,您可以将单个加权边 (u, v, w) 添加到图 G,如下所示:

G.add_edge(u, v, len=w)

这是使用 Florentine families graph 的完整示例:

# 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()

为了说明使用边长时布局的差异,这是我将一阶节点(“Ginori”和“Pazzi”)的两条边设置得更长的结果: Florentine with some longer edges

这是使用任何边长的结果: Florentine with all edges lengths the same

关于python - 根据 graphviz_layout 中的权重设置边长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084143/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com