【发布时间】:2021-01-27 03:01:57
【问题描述】:
我正在尝试显示“圆柱形”有向图(以从左到右的格式),以便可以在圆柱体上绘制它们。这些图由连续的节点列组成。最右边的节点列(用虚线描绘)是最左边的节点列的替代品 - 这样可以打印出图形,卷成圆柱体,并且虚线节点与第一列的“下方”完全对齐节点,它显示了一个连续的(圆柱形)循环图。
我已经成功使用“rank”来获得柱状节点对齐,并使用“group”来建议第一列和最后一列之间的水平节点对齐。 (这个Graphviz Dot vertical alignment of nodes 特别有用。)
问题是,我不希望第一列和最后一列的节点都垂直展开(见图);与任何其他节点列中的节点之间相比,第一个 col 的节点(最后一个 col 的节点同上)之间不应有更多的垂直分隔。但相应的第一个/最后一个 col 节点必须保持水平对齐。 (我想它试图让节点对 1->15 和 13->16 中的水平不可见边缘不受中间节点的阻碍;但我不需要它们不受阻碍。节点 1 和 13(以及 15 和 16)应该有大约与(例如)节点 5 和 14 之间的垂直间隔相同。)
TL;DR 版本
- 图形从左到右“流动”,按“节点列”的顺序排列(fwiw 所有边都指向右侧,并且总是只走一步,从第 j 列到第 j+1 列)
- 最右边的列需要是最左边的列的“副本”(反映圆柱形环绕)- 它应该看起来像最左边的列的复制和粘贴,在相同的垂直高度
- 这也必须适用于更复杂的图形(例如this one;最左边和最右边的列的节点排列得相当好,但我担心异常值),并且必须来自自动化过程(没有罚款-手动调音)
digraph {
node[label=""];
rankdir="LR"
1->8[label="c"]
13->8[label="a"]
8->12[label="b"]
12->10[label="a"]
10->5[label="a"]
10->14[label="b"]
5->2[label="a"]
5->9[label="b"]
14->9[label="a"]
2->4[label="b"]
9->4[label="a"]
// "wraparound" nodes
node[label="", style="dashed"];
4->15[label="a"] // since "a" connected 4 to 1, 15 must be in the same group as 1 (subs for 1)
node[label="", style="dashed"];
4->16[label="c"]
{rank=same; 1[group=g1]; 13[group=g2]}
{rank=same; 8}
{rank=same; 12}
{rank=same; 10}
{rank=same; 5, 14}
{rank=same; 2, 9}
{rank=same; 4}
// new nodes also need to have same rank; groups should pair corresponding nodes, w/ correct edge letter
{rank=same; 15[group=g1]; 16[group=g2]}
edge[style=invis];
1->15
13->16
}
【问题讨论】: