如何使用Python NetworkX展示两个Digraph的节点与边差异
Graphviz有向图差异比对实现方案
1. 核心实现步骤
- 第一步:解析Dot文件提取结构化信息
分别读取两个Digraph代码,按出现顺序提取三类信息:- 全局配置项:
layout、ordering、rankdir等公共参数 - 节点集合:按出现顺序存储每个节点的唯一ID、属性(填充色、标签、形状、样式)
- 边集合:按出现顺序存储每条边的源节点ID、目标节点ID
- 全局配置项:
- 第二步:按顺序做差分对比
严格遵循两个Dot文件原有的文本排列顺序做比对,避免打乱原有逻辑层级:- 全局配置:逐行比对,相同项保留原有样式,不同项标注修改点
- 节点对比:先遍历第一个图的节点,对应查找第二个图的同ID节点,属性不同标注修改;第一个图存在第二个图不存在的标注为删除;第二个图独有的节点标注为新增
- 边对比:逻辑同节点对比,按顺序比对边的源、目标节点,增删改分别标注
- 第三步:生成带差异标记的可视化Dot代码
给差异内容添加特殊样式:删除节点/边用红色填充/红色虚线,新增节点/边用绿色填充/绿色实线,修改节点/边用橙色填充/橙色实线,相同内容保留原有样式。
2. 示例差异对比Dot代码
digraph G { layout=dot; ordering=in; rankdir=LR; # 相同节点保留原有样式 "VOICE" [fillcolor=forestgreen, shape=box, style=filled]; "VOICE___VOICE" [fillcolor=yellow, label="VOICE", style=filled]; # 左侧图独有的match-all节点,标红表示删除 "VOICE___VOICE___match-all " [fillcolor=red, label="match-all (仅左图存在)", shape=diamond, style=filled]; "VOICE___VOICE___match-all ___match access-group ipv4 VOICE" [fillcolor=pink, label="match access-group ipv4 VOICE", shape=egg, style=filled]; "VOICE___VOICE___match-all ___match dscp cs3" [fillcolor=red, label="match dscp cs3 (仅左图存在)", shape=egg, style=filled]; "VOICE___VOICE___match-all ___end-class-map" [fillcolor=pink, label="end-class-map", shape=egg, style=filled]; # 右侧图独有的match-any节点,标绿表示新增 "VOICE___VOICE___match-any " [fillcolor=lightgreen, label="match-any (仅右图存在)", shape=diamond, style=filled]; "VOICE___VOICE___match-any ___match access-group ipv4 VOICE" [fillcolor=lightpink, label="match access-group ipv4 VOICE", shape=egg, style=filled]; "VOICE___VOICE___match-any ___match mpls experimental topmost 5" [fillcolor=lightgreen, label="match mpls experimental topmost 5 (仅右图存在)", shape=egg, style=filled]; "VOICE___VOICE___match-any ___end-class-map" [fillcolor=lightpink, label="end-class-map", shape=egg, style=filled]; # 左图边 "VOICE" -> "VOICE___VOICE"; "VOICE___VOICE" -> "VOICE___VOICE___match-all " [color=red, style=dashed, label="仅左图存在"]; "VOICE___VOICE___match-all " -> "VOICE___VOICE___match-all ___match access-group ipv4 VOICE" [color=red, style=dashed]; "VOICE___VOICE___match-all " -> "VOICE___VOICE___match-all ___match dscp cs3" [color=red, style=dashed]; "VOICE___VOICE___match-all " -> "VOICE___VOICE___match-all ___end-class-map" [color=red, style=dashed]; # 右图边 "VOICE___VOICE" -> "VOICE___VOICE___match-any " [color=green, label="仅右图存在"]; "VOICE___VOICE___match-any " -> "VOICE___VOICE___match-any ___match access-group ipv4 VOICE" [color=green]; "VOICE___VOICE___match-any " -> "VOICE___VOICE___match-any ___match mpls experimental topmost 5" [color=green]; "VOICE___VOICE___match-any " -> "VOICE___VOICE___match-any ___end-class-map" [color=green]; }
3. 效果说明
生成的可视化图会按原有文本顺序对齐展示,相同内容保留原有样式,删除内容标红、新增内容标绿、修改内容标橙,可直观看到两个图的节点、边差异。
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

