Python Diagrams包如何创建带rank='same'属性的子图?
diagrams 实现同层级
rank="same" 效果的可行方案 diagrams 是对 Graphviz Dot 语法的上层封装,默认没有直接开放 rank 属性的快捷配置入口,但可以通过两种可落地的方式,完全等价实现原生 Dot 语法中带 rank=same 的子图同层对齐效果,覆盖两类典型使用场景。
独立同层级子图场景实现
该场景不需要显式创建带 rank 属性的子图实体,利用 Graphviz 本身的布局逻辑即可实现对齐效果:
- 该方式对不同版本的 Graphviz 布局引擎兼容性更好,出现布局错位的概率比手动注入子图 rank 属性更低
- 正常创建所有需要同层级排布的节点
- 通过无视觉效果的隐藏连接边把待对齐的节点绑定为逻辑组,布局引擎会自动将同组节点排布在同一 rank 层级
- 如果需要完全隐藏连线,可在连接逻辑里透传
edge_attr={"style": "invis"}参数,最终生成的图和手动写原生子图的视觉效果无差异
可直接运行的示例代码:
from diagrams import Diagram from diagrams.aws.compute import EC2 with Diagram("独立同层对齐示例", show=False, direction="TB"): co2_node1 = EC2("CO2") co2_node2 = EC2("CO2") co2_node3 = EC2("CO2") # 隐藏连线绑定同组,等价 rank=same 效果 co2_node1 >> co2_node2 >> co2_node3
类簇内部嵌套同层子图实现
类簇内部的嵌套子图对齐,需要借助 diagrams 中 Cluster 对象可透传 Graphviz 原生属性的能力实现:
- 正常创建带显示边框、带标题的外层 Cluster 容器
- 在 Cluster 上下文内实例化一个空标题、无显示样式的隐藏 Cluster,该对象在底层会被渲染为普通子图(只有这类非特殊簇类型的子图支持配置 rank 属性)
- 给这个隐藏 Cluster 透传
graph_attr={"rank": "same", "style": "invis"}属性,再把需要同层对齐的节点放入该隐藏子图的上下文即可
可直接运行的示例代码:
from diagrams import Diagram, Cluster from diagrams.aws.compute import EC2 with Diagram("簇内嵌套同层对齐示例", show=False, direction="TB"): # 外层正式展示的业务簇 with Cluster("业务集群"): # 嵌套的隐藏子图,不显示边框、不展示标题 with Cluster("", graph_attr={"rank": "same", "style": "invis"}): co2_node4 = EC2("CO2") co2_node5 = EC2("CO2")
内容的提问来源于stack exchange,提问作者anidue
相关产品推荐
相关产品推荐

