如何用Graphviz绘制中心含节点的环形图?多节点中心布局可行吗?
Graphviz circo布局实现中心节点/集群的环形图方案
单个中心节点的解决方法
circo布局的root属性仅对层次类布局(如dot)生效,环形布局下不发挥作用。你可以通过调整边的长度属性引导布局,让目标节点自动处于中心:
修改你的示例代码,给中心节点与外围节点的边设置更短的理想长度,外围节点间的边设置更长的长度,circo会根据边的长度约束将中心节点放在环形中心:
graph g1 { layout=circo; 0 -- 1 [len=1]; 0 -- 2 [len=1]; 0 -- 3 [len=1]; 0 -- 4 [len=1]; 0 -- 5 [len=1]; 0 -- 6 [len=1]; 1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 1 [len=2]; }
这里len属性控制边的理想长度,外围节点间的边更长会被拉伸形成环形,而中心节点因与所有外围节点的边更短,自然落在环形中心位置。
多节点集群置于中心的实现
如果需要多个节点组成的集群位于环形中心,可以通过隐形集群+内部隐形边的方式实现,无需添加新的隐藏节点:
graph g2 { layout=circo; clusterrank=none; # 创建隐形集群包裹中心节点,避免显示集群边框 subgraph cluster_center { style=invis; 0; 1; # 添加隐形边让中心节点布局紧凑 0 -- 1 [style=invis]; } # 中心集群与外围节点的连接边 0 -- 2; 0 -- 3; 1 -- 4; 1 -- 5; 0 -- 6; # 外围节点的环形连接 2 -- 3 -- 4 -- 5 -- 6 -- 2; }
clusterrank=none会让集群作为整体参与布局,隐形的集群边框和内部边不会影响你的数据文件用途,同时能让中心节点集群紧凑排列在环形中心,外围节点自动环绕形成环形。
你也可以通过调整边的权重(weight)替代长度属性,权重越高的边会被布局得更短、更紧凑,同样能达到引导中心集群布局的效果。
内容的提问来源于stack exchange,提问作者kebs
相关产品推荐
相关产品推荐

