如何在Graphviz中将边标签放在边上

51

默认情况下,在Graphviz中,边缘标签放置在边缘的右侧。我正在寻找一种将标签放置在边缘上方且居中的方法。(因为我正在更改边缘的颜色,所以标签仍然可读)。

有什么想法吗?

4个回答

24
如果你想调整的是头部标签或尾部标签,你可以尝试将labeldistance设置为零,强制在边缘上绘制标签。但据我所知,你指的是边缘标签(位于边缘中间的标签)。文档非常明确地说明labeldistance仅影响头部和尾部标签,但你可以试一试。
另外一个你可能想尝试的方法是创建一个带有标签的透明中间节点。它看起来可能符合你的需求...但如果你严重依赖于节点放置算法,那么创建这些“人工”节点可能无法接受。在这种情况下,我鼓励你加入Graphviz开发人员,并添加你需要的功能。 ;) 说真的,这是非常令人满意的事情。
如果你找到另一个解决方案,请发布出来。我将在不久的将来遇到类似的问题。

是的,看起来目前就是这样了。我会考虑为graphviz做出贡献,但和你一样,我的问题至少还要再过几个月才会成为问题。 - naught101
有人最终是否添加了沿边对齐标签的功能?我是Graphviz的新手,刚刚安装了2.38版本,很想这样做。 - Riggster

6

考虑在标签后添加一些空格。这样,您就可以避免与边缘箭头重叠,因为graphviz标签是右对齐的。这不是一个优雅的解决方案,我很想看到一个合适的标签对齐,但它可能会解决您的问题。


1

根据前两个答案,以下是我的解决方案:使用taillabel/labeldistance,透明边缘和空白间隔。

如果两个节点之间只有一条边,请使用透明边缘。下面是一个示例及其结果。

digraph G {
    rankdir=BT;
    A -> B [label="               ", minlen=3, headlabel="A overlay text\non edge", labeldistance=8];
    B -> A [color=white];
}

overlay

如果两个节点之间有两条边,不需要使用透明的边缘,只需使用空白间隔来调整它们的相对位置,并使文本真正地覆盖在边缘上方。
digraph G {
    rankdir=BT;
    A -> B [label="                    ", minlen=3, headlabel="An overlay\ntext", labeldistance=6];
    B -> A [headlabel="       B to A", labeldistance=4];
}

overlay2


1

这是最近在Graphviz论坛(https://forum.graphviz.org/t/fun-with-edge-labels/1643)上讨论的(由我提出的)。 讨论中包含了一个使用gvpr编写的后处理器的链接(https://www.graphviz.org/pdf/gvpr.1.pdf)(Graphviz系统的一部分),该后处理器可以让用户重新定位边标签,包括放置在边的上方。
以下是输入dot程序和结果的示例。 请注意,在许多情况下,标签放置故意不居中。
这不是通用解决方案,但在许多情况下很有用。

graph straight {
  splines=false
  edge [label="\T" labelOverlay=true color=purple]
  node [shape=rect style=filled fillcolor=lightblue]

    a1 -- b1
    c1 -- d1  [labelOverlay="15%" label=high]
    e1 -- f1  [label2node=true labelOverlay="75%" label=low]
    g1:sw -- h1:nw  
    g1:s -- h1:n  [labelOverlay="20%"]
    g1:se -- h1:ne  
    j1 -- k1  [ label2node=true]

  node[shape=square style=filled fillcolor=lightgreen]
    {rank=sink
    edge [fontcolor=red]
    Aaa -- B3  [labelOverlay="33%"]
    C98 -- D3  [labelOverlay="80%" label2node=true]
    Eee -- F6  [label="adjust me" labelAdjust="45,-25"]
    G12 -- H3  [label2node=true]
    node [shape=plain fontcolor=blue style=""]
    Lxx -- M123
    Noo -- Ooo [label2node=true]
    node [shape=oval fontcolor=blue style=""]
    P  -- Q
    }

    node[shape=circle style=filled fillcolor=pink]
    edge [label2node=true label="aeiou" labelOverlay="78%"]
    10 -- {11 12}
    10 -- 13 [labelOverlay="38%"]    
    10 -- 14 [labelOverlay="62%"]    
    edge [label="three"]
    node [shape=Mrecord]
    13 --  21
    edge [labelOverlay="55%" label="T\nh\nr\ne\ne\n \n33"] 13 -- 22
    edge [labelOverlay="60%"] 13 -- 23
}

enter image description here


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