Graphviz图形定位x轴标签

34

我已经尝试使用xlp并且遵循了这个graphviz线程(http://www.graphviz.org/content/how-use-xlp-attribute-positioning-external-labels-xlabel),但都没有实际起作用。

这是我的dot代码:

digraph {
    forcelabels=true;
    rankdir=LR;
    graph[ranksep=1,nodesep=.5];
    node[shape=box];
    "start" [xlabel="start",xlp="0,0",shape=doublecircle,label=" "];
    "requested"->"fault";
    "requested"->"progress";
    "start"->"requested";
    "progress"->"fault";
    "progress"->"progress";
    "progress"->"complete";
    "fault" [xlabel="fault",shape=doublecircle,label=" "];
    "complete" [xlabel="complete",shape=doublecircle,label=" "];
}

这就是它的样子:enter image description here

理想情况下,开始、故障和完成应该直接位于节点下方,但是我似乎无法正确地定位x轴标签。


我有完全相同的问题,我也想将标签定位在节点下方,但似乎没有任何教程或指南来说明如何实现。 - Charl Meyers
我尝试了 xlabels,但它们的定位似乎有问题。 - Nick Roz
我一直在查看由dot生成的数据 - 更改xlp信息似乎没有任何作用 cf. http://www.graphviz.org/content/how-use-xlp-attribute-positioning-external-labels-xlabel 同样地,更改实际的pos值也是如此。 - d-cubed
1
我意识到这个评论来得有点晚了(也许情况已经改变了),但在文档中,属性表中指出:xlp NE point 只写。然后在该表格上面它说:“_只写_表示该属性用于输出,不会被任何布局程序使用或读取”,这就解释了为什么设置它并没有任何作用。 - Samuel Harmer
3个回答

15

如果您使用带有-n2标志的neato,则应该能够设置xlabel的位置。不过您需要指定每个节点的位置。

因此,如果您有一个名为lb.gv的文件,并且其内容如下:

digraph{
    forcelabels=true;
    rankdir=LR;
    graph[ranksep=1,nodesep=.5,margin=0.3,bgcolor=Transparent];

    node[shape=box];
    start [pos="0,0", xlp="23,54", xlabel=start, shape=doublecircle, label= " "];
    requested [pos="100,0"];
    progress [pos="250,-66"];
    fault [pos="400,70", xlp="424,124", xlabel=fault, shape=doublecircle,label= " "];
    complete [pos="400,-66", xlp="424,-10", xlabel=complete, shape=doublecircle,label= " "];
    requested->fault;
    requested->progress;
    start->requested;
    progress->fault;
    progress:w->progress:_;
    progress->complete;
}
你可以运行neato -n2 -Tpng lb.gv > test.png 那就是我得到的: graphviz

14
注意:这迫使你将所有内容都明确地放置,这很麻烦,而且有一半的作用与graphviz相悖。 - Ciro Santilli OurBigBook.com
我遇到了同样的问题,似乎仍然没有避免显式放置所有内容的功能? - Kumpelka
2
@IvanChaer,该功能请求现在位于 https://gitlab.com/graphviz/graphviz/issues/299 和 https://gitlab.com/graphviz/graphviz/issues/68。 - mtd

2
不完全是你所问的,但你可以尝试类似这样的东西:
digraph nodes_as_labels {
    rankdir=LR;
    graph[ranksep=1,nodesep=.5];
    node[shape=box];

    "start" [xlp="0,0",shape=doublecircle,label=" "];
    "fault" [shape=doublecircle,label=" "];
    "complete" [shape=doublecircle,label=" "];
    "startlabel" [label="start",penwidth="0"];
    "faultlabel" [label="fault",penwidth="0"];
    "completelabel" [label="complete",penwidth="0"];

    "startlabel" -> "start"[style="invis"];
    "requested"->"fault";
    "requested"->"progress";
    "start"->"requested";
    "progress"->"fault";
    "progress"->"progress";
    "progress"->"complete";
    "fault" -> "faultlabel"[style="invis"];
    "complete" -> "completelabel"[style="invis"];
}

这导致:

gv converted to png

这种方法在使用neato或fdp布局引擎时更为相关,因为然后您可以使用len属性来设置充当标签的节点与您要标记的节点之间的距离。这样,您就可以防止标签重叠边缘。不幸的是,len属性对于本示例使用的dot布局引擎无效,这就是为什么结果中的标签远离它们所标记的节点的原因。

2
  • 使用标签字符串中的换行符在节点下方显示文本
  • 设置fixedsize=true以保持节点大小不变
  • 添加cluster以防止最低的标签被截断
digraph {
    rankdir=LR;
    graph[ranksep=1,nodesep=.5];
    //  add a cluster to provide "margin" for labels below nodes
    subgraph cluster_space {
      graph [peripheries=0]
      node[shape=box];
      // dot ignores xlp
      // add newlines to shift label down
      // fixedsize=true to keep node sized correctly
      "start" [label="\n\n\n\nstart" shape=doublecircle fixedsize=true ];
      "requested"
      "progress"
      "complete" [label="\n\n\n\ncomplete" shape=doublecircle fixedsize=true]
      "fault" [label="\n\n\n\nfault" shape=doublecircle fixedsize=true]

      "requested"->"fault";
      "requested"->"progress";
      "start"->"requested";
      "progress"->"fault";
      "progress"->"progress";
      "progress"->"complete";
    }
}

给予:
enter image description here

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