基于Python的Networkx MultiDiGraph流程类可视化方案问询
NetworkX MultiDiGraph 类UML活动图可视化方案
核心方案
用NetworkX结合Matplotlib实现,通过固定布局种子保证可视化一致性,自定义节点样式模拟UML活动图,处理多重边与回环,无需精准对齐但满足对比分析需求。
实现代码
import networkx as nx import matplotlib.pyplot as plt # 替换为你的MultiDiGraph节点/边数据 G = nx.MultiDiGraph() G.add_nodes_from(["活动A", "活动B", "活动C", "活动D"]) G.add_edges_from([ ("活动A", "活动B"), ("活动A", "活动C"), ("活动B", "活动C"), ("活动C", "活动B"), # 回环边 ("活动C", "活动D"), ("活动B", "活动D"), # 多重边 ]) # 固定布局:优先用dot布局(层次化,符合活动图流程方向),需依赖Graphviz # 安装依赖:系统层面装Graphviz + pip install pygraphviz pos = nx.nx_agraph.graphviz_layout(G, prog='dot', args='-Grankdir=LR', seed=42) # 无Graphviz时,改用spring_layout并固定seed,保证布局一致 # pos = nx.spring_layout(G, seed=42, k=0.8) # 绘制节点:方形+白填充黑边框,模拟UML活动节点样式 nx.draw_networkx_nodes( G, pos, node_shape='s', node_size=3500, node_color='white', edgecolors='black', linewidths=2 ) # 绘制边:用弧度区分多重边,回环自动适配显示 nx.draw_networkx_edges( G, pos, connectionstyle="arc3,rad=0.15", arrowsize=20, edge_color='black' ) # 添加节点标签 nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold') # 可选:添加边标签(若需展示边属性) # edge_labels = {(u, v, k): f"边{k+1}" for u, v, k in G.edges(keys=True)} # nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=10) # 优化显示 plt.axis('off') plt.tight_layout() # 保存或展示 plt.savefig("流程对比图.png", dpi=150, bbox_inches='tight') plt.show()
关键细节说明
- 布局一致性:所有布局算法指定
seed参数,确保每次运行生成完全相同的节点位置,满足不同流程版本的对比需求。 - UML活动图样式:用方形节点(
node_shape='s')、白色填充黑色边框,匹配活动图中"活动"元素的视觉特征。 - 多重边与回环处理:通过
connectionstyle设置边的弧度,避免多重边重叠;回环边会自动绘制在节点周围,无需额外配置。 - 无Graphviz替代方案:若无法安装Graphviz,改用
spring_layout并固定seed,虽为力导向布局,但一致性不受影响,仍可用于对比。
内容的提问来源于stack exchange,提问作者mrb
相关产品推荐
相关产品推荐

