使用NetworkX的graphviz_layout绘图时修改边权重致边消失求助
解决NetworkX + graphviz_layout(dot)中修改边权重后边消失的问题
问题根源
graphviz的dot布局工具会将边的weight属性视为布局优先级参数(权重越高,边越倾向于短直路径,对节点层级布局的影响越大),而非单纯的显示标签。当你把11->13的权重从10改为9后,其布局优先级降低,dot算法可能调整节点位置,导致这条边被其他边/节点遮挡,或与11->12->13的路径重叠,最终在绘图时不可见。
可行解决方案
方法1:分离布局权重与显示权重
将用于显示的权重和影响布局的权重分开,避免显示值干扰布局计算:
import numpy as np import matplotlib.pyplot as plt import networkx as nx from networkx.drawing.nx_agraph import graphviz_layout if __name__ == '__main__': edges_weight = np.array([ [1, 2, 30], [2, 3, 22], [3, 4, 5.97], [4, 5, 5.97], [3, 6, 16.03], [6, 7, 4.03], [7, 8, 4.03], [5, 8, 5.97], [8, 9, 9], [9, 16, 10], [2, 10, 8], [10, 11, 8], [11, 12, 2], [12, 13, 2], [11, 13, 9], [13, 15, 8], [15, 16, 20], [6, 17, 12], [17, 18, 12], [18, 15, 12], [16, 14, 30]]) G = nx.DiGraph() for u, v, w in edges_weight: # 显示用的权重存为label,布局权重统一设为1(消除布局干扰) G.add_edge(u, v, label=str(w), weight=1) # 获取显示用的边标签 edge_labels = nx.get_edge_attributes(G, 'label') shell_pos = graphviz_layout(G, prog='dot') plt.figure(figsize=(10, 15)) nx.draw_networkx_nodes(G, shell_pos, node_color='lightblue', node_size=1200) nx.draw_networkx_labels(G, shell_pos) nx.draw_networkx_edges(G, shell_pos, node_size=1200, arrowstyle='->', arrowsize=10, width=2) nx.draw_networkx_edge_labels(G, shell_pos, edge_labels=edge_labels) plt.show()
方法2:禁用特定边的布局约束
如果需要保留原布局逻辑,仅让11->13边强制显示,可给这条边添加constraint=False属性,让dot布局时不考虑这条边的层级约束:
# 修改边添加逻辑 for u, v, w in edges_weight: attrs = {'weight': w} if (u, v) == (11, 13): attrs['constraint'] = False # 排除这条边的布局约束 attrs['penwidth'] = 3 # 加粗边,提升可见度 G.add_edge(u, v, **attrs)
方法3:单独高亮绘制目标边
如果上述方法无效,可单独绘制11->13这条边,用不同样式突出显示:
# 先绘制所有常规边 nx.draw_networkx_edges(G, shell_pos, node_size=1200, arrowstyle='->', arrowsize=10, width=2) # 单独绘制11->13边,用红色加粗 nx.draw_networkx_edges(G, shell_pos, edgelist=[(11,13)], node_size=1200, arrowstyle='->', arrowsize=10, width=3, color='red')
内容的提问来源于stack exchange,提问作者王建凯
相关产品推荐
相关产品推荐

