You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Networkx中Graph与DiGraph绘图布局不同如何实现统一

问题解答

差异原因

你当前的代码会在切换图类型后,重新基于当前Graph/DiGraph实例计算弹簧布局,即使固定了随机种子,有向图和无向图在布局算法中的计算逻辑存在差异,最终生成的节点坐标自然会不一致。

解决方案

核心思路是提前使用统一的无向图结构预计算固定的布局坐标,后续绘制不同类型的图时直接复用该坐标即可,无需每次都基于当前要绘制的图实例计算布局。
如果需要节点大小、颜色等属性也完全对齐,也可以基于预先生成的无向图计算这些属性,不受后续切换图类型的影响。

修改后可直接运行的代码

import networkx as nx
import matplotlib.pyplot as plt

# 先统一用无向图预计算固定布局、节点属性,和后续绘制的图类型无关
relation_list = [['A', 'B'], ['A', 'C'], ['A', 'D'], ['A', 'E'], ['C', 'F'], ['F', 'I'], ['F', 'H'], ['F', 'G'], ['F', 'J']]
temp_undir_graph = nx.Graph()
temp_undir_graph.add_edges_from(relation_list)
# 预计算固定布局,只要这个步骤的输入不变,节点坐标永远一致
my_pos = nx.spring_layout(temp_undir_graph, seed = 0)
# 预计算节点颜色、大小,不受后续图类型切换影响
colors = {"red": ["A", "B", "C"], "green": ["D", "E", "F"], "yellow": ["G", "H", "I", 'J']}
node_color_map = {}
for color, nodes in colors.items():
    node_color_map.update(dict.fromkeys(nodes, color))
node_list = list(temp_undir_graph.nodes)
node_color_list = [node_color_map.get(node) for node in node_list]
dict_of_node_sizes = dict(temp_undir_graph.degree)

# -------------------- 下方切换图类型,节点排布完全不会变 --------------------
# 无向图模式
# analysis_graph = nx.Graph()
# 有向图模式
analysis_graph = nx.DiGraph()
analysis_graph.add_edges_from(relation_list)

# 绘图直接复用提前计算好的布局和属性
print(nx.info(analysis_graph))
plt.figure(figsize=(25,17))
nx.draw(analysis_graph, 
        pos = my_pos, 
        with_labels = True, 
        arrowsize=20, 
        font_size=12, 
        node_size=[(v+1) * 150 for v in dict_of_node_sizes.values()],
        node_color=node_color_list)
plt.show()

内容的提问来源于stack exchange,提问作者taga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:09:02