Graphviz: 如何旋转节点(或子图)?

9
我正在尝试使一个节点(或子图,包围一个节点-无论哪个更容易)旋转,就像这张图片中所示:desired rotated node effect。(请注意,如果“B”标签被旋转了,对我来说并不重要-只有“verti-*”记录中的文本[或整个记录节点]如图所示被旋转即可)。
然而,我能找到的最接近的是以下dot代码:
digraph graphname {
    node [fontname=Monospace, fontsize=14]; 
    subgraph clusterMasterBox {
        node [shape=record];
        l1 [label = "{ horiz-1 \r| \
 horiz-2 \r| \
 horiz-3 \r| \
 horiz-4 \r} \
"];
        subgraph clusterSubRotateBox {
            rotate=90;
            node [shape=record,rotate=90];
            l2 [label = "{ verti-1 \r| \
 verti-2 \r| \
 verti-3 \r| \
 verti-4 \r} \
"];     
            label="B";
        }
    label="A"
    }
}

我在clusterMasterBox里面嵌套了subgraph clusterSubRotateBox,这样做的唯一原因是我希望能够对它进行旋转,但显然我不能 - 因为上面的代码生成了这张图片:gviz rotate actual。所以我的问题是 - 是否有一种方法可以旋转记录节点; 如果不是单独旋转,则可以作为子图(或不同类型的“对象”)的一部分进行旋转吗?谢谢提前任何建议,祝好!
4个回答

7
如果您想旋转基于节点的单个记录,则可以使用 rankdir 。我在我的图表中尝试了它。
digraph plugnoid {
    rankdir=LR;
    node[shape=Mrecord];
    plugnoid [label="swarm| {<load0> onLoad|<plugin0> Plugin|<quit0> onQuit}|{<run0>run|<rehash0>rehash}"];}

图片描述

rankdir可以有LR、RL和TB(默认)三个值。当我把rankdir改为TB时,输出结果发生了变化。

图片描述

您可能希望在自己的图表中尝试这些值,以获得所需的结果。我发现,当我使用子图并设置不同的rankdir时,结果并不好。请参见http://www.graphviz.org/doc/info/shapes.html#record了解更多详细信息。


5

对于单个节点,有一个名为orientation的属性。我刚刚使用了

node[shape=hexagon, orientation=30]

来制作一个顶部有尖角而不是平顶部的六边形。

不幸的是,这似乎在“record”类型上不起作用 :-(


2
这适用于形状,但不幸的是,它不能旋转标签。 - Clay

4

图形对象应该有一个“rotation”属性(参见http://www.graphviz.org/doc/info/attrs.html#drotation),但在我的测试中没有起作用。根据文档,它只适用于整个图形(而非簇/子图)。 我猜你首先需要将子图渲染为PostScript,然后将其作为单个占位符节点的自定义形状包含在最终图形中。如果无法让“rotation”发挥作用,那么肯定有一种简单的方法可以在PostScript中应用变换(在这种情况下是旋转),可能只需要在生成的代码前加上一些坐标定义即可。抱歉我现在没有时间尝试。


感谢评论,@mwx!那是迄今为止最好的答案(只是确认旋转属性仅适用于整个图形),因此+1并接受... - sdaau

0

Graphviz不支持部分旋转 - 只能旋转整个图形或多边形节点(https://www.graphviz.org/docs/attrs/rotate/https://graphviz.org/docs/attrs/orientation/)。 为了实现您的目标,请为每个要旋转的节点或簇创建一个单独的图形,并使用dot(或所需的引擎)创建图像(png、svg等)。然后使用image属性将每个图像包含到一个节点中(https://graphviz.org/docs/attrs/image/)。
请注意,Graphviz仅支持rotate=90,而您正在请求-90。使用其他图像处理程序将结果旋转180度(天哪)
完整图形如下:
rotatePart1a.gv

digraph graphname {
    node [fontname=Monospace, fontsize=14];

    subgraph clusterMasterBox {
      label="A"
      {rank=same  // keep on same rank
      
        l2 [shape=plain label="" image="rotatePart1b.png"]

        node [shape=record];
        l1 [label = "{ horiz-1 \r| \
 horiz-2 \r| \
 horiz-3 \r| \
 horiz-4 \r} \
"];

    }
    }
}

rotatePart1b.gv

digraph graphname {
    rotate=90;
    node [fontname=Monospace, fontsize=14]; 
 
        subgraph clusterSubRotateBox {

            node [shape=record]  // rotation at node-level is silently ignored
            l2 [label = "{ verti-1 \r| \
 verti-2 \r| \
 verti-3 \r| \
 verti-4 \r} \
"];     
            label="B";
        }
}

给定:
在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接