如何让Graphviz节点按边锚点定位以生成直向箭头?
问题
我希望生成的节点图表能体现各节点设置的方向信息,对应的digraph代码如下:
north_america:s -> south_america:n [label="S"]; north_america:e -> europe:w [label="E"]; europe:s -> africa:n [label="S"]; south_america:e -> africa:w [label="E"]; europe:e -> asia:w [label="E"]; }
使用命令 dot -Tpng in.dot > out.png 生成的结果不符合预期,我希望东向箭头为水平向右的直线,南向箭头为垂直向下的直线。请问能否通过Graphviz生成器搭配合适参数实现该效果?
解决方案
完全可以实现,这里提供两种实用方法:
方法1:neato布局+固定节点坐标
neato支持精确的节点位置控制,直接给每个节点指定相对坐标,就能让箭头严格按水平/垂直方向走直线:
layout=neato; // 指定使用neato布局引擎 node [shape=box]; // 可选,统一节点样式 // 用pos属性固定节点位置,后缀!表示强制使用该坐标 north_america [pos="0,3!"]; south_america [pos="0,1!"]; europe [pos="2,3!"]; africa [pos="2,1!"]; asia [pos="4,3!"]; north_america:s -> south_america:n [label="S"]; north_america:e -> europe:w [label="E"]; europe:s -> africa:n [label="S"]; south_america:e -> africa:w [label="E"]; europe:e -> asia:w [label="E"]; }
生成命令用:neato -Tpng in.dot > out.png
方法2:dot布局+rank约束
如果不想手动写坐标,可以利用dot的rank机制,把同一水平方向的节点归为同一rank,垂直方向的节点分属不同rank,强制箭头走直线:
rankdir=TB; // 整体采用从上到下的垂直布局方向 node [shape=box]; // 将水平对齐的节点放在同一rank组里 { rank=same; north_america; europe; asia; } { rank=same; south_america; africa; } // 定义边,此时箭头会自动走水平/垂直直线 north_america:s -> south_america:n [label="S"]; north_america:e -> europe:w [label="E"]; europe:s -> africa:n [label="S"]; south_america:e -> africa:w [label="E"]; europe:e -> asia:w [label="E"]; }
生成命令还是用原来的:dot -Tpng in.dot > out.png
内容的提问来源于stack exchange,提问作者Greg C
相关产品推荐
相关产品推荐

