Graphviz中是否有自动多行标签功能?

33
我正在使用Graphviz绘制一些图形。我在节点上使用标签,并可以输入"\n"来强制将标签拆分成两行。是否有一种方法让Graphviz(或我正在使用的dot)自动识别应该拆分某些节点标签,并自动做出最佳选择呢?

这个回答解决了你的问题吗?使用dot(graphviz)进行文本换行 - Ooker
4个回答

26

是的,类似 HTML 的标签(<...>)支持
标签,使用它可以换行。例如:

是的,类似 HTML 的标签(<...>)支持
标签,使用它可以换行。例如:

"A" -> "B"
[label = <1. <br/> 2. <br/> 3. <br/> 4. <br/> .... <br/> > color="blue" style="dashed"];

这些方法在将Graphviz嵌入LaTeX中时也适用,而\n则不行。


4
这不是直接回答问题,但提供了一个很好的解决方法,所以我给它点赞。 - Pascal
我撤回了我的反对票(并编辑了一下,以便我可以投赞成票),因为这是唯一的方法,当我在LaTeX中嵌入Graphviz时能够通过。 - Samuel Harmer
@Pascal 如果这不能回答问题,那么它怎么能成为一个解决方法呢? - Ooker

13

我也搜索过这个问题,但我认为在当前版本中不可能实现。目前的“解决方案”是编写代码,根据节点之间的最小距离(nodesep属性,如果我没有记错的话),每隔几个字符自动添加"\n"。


3
你也可以使用类似HTML的标记(用<...>引用而不是“...”),这些标记不会自动换行,但比\n更能控制布局。也许结合计算渲染后字符串长度的系统图形库的估计,可以猜测出在哪里放置断点比较好? - Jason Kleban

2
有人编写了一段Perl脚本来实现这个功能。我在他的博客中找到了它:使用dot(graphviz)实现文本换行

⚠ 注意

仅当标签格式为node [ label=”node label” ]时才有效。如果节点直接声明(例如”node label”),则无效。

Perl脚本:

#!/usr/bin/perl
use strict;
 
my $usage = "setdotlabelwidth [char-width] < [dotfile]";
my $width = shift() or die("Usage: $usage $!");
 
while(<STDIN>)
{
  if(m/label="(.*?)"/)
  {
    my $labeltext = $1;
    my @words = split(/ /, $labeltext);
    my @newtext = ();
    my $newline = "";
    foreach my $word(@words)
    {
      if( length($newline) > 0 and
          length($newline) + length($word) > $width )
      {
        push(@newtext, $newline);
        $newline = "";
      }
      $newline .= " " if( length($newline) > 0 );
      $newline .= $word;
    }
    push(@newtext, $newline) if( length($newline) > 0 );
    my $newlabel = join("\\n", @newtext);
    s/label=".*?"/label="$newlabel"/;
  }
  print;
}

将此程序保存为setdotlabelwidth,然后将输出直接传输到GraphViz。例如,如果您想将宽度设置为35个字符,则命令如下:

./setdotlabelwidth 35 < tile-error-correction.dot | dot -Tpng -o tile-error-correction.png

之前: 之后:


注:本段内容是关于如何使用setdotlabelwidth程序和GraphViz软件来设置图形标签的宽度,并提供了示例图片以便更好地理解。

1

(不确定我们应该如何处理重复的问题?)

dot2tex(latex + graphviz)处理文本换行,以及其他解决graphviz排版限制的方法。您可以在this重复的问题中找到一个简短的示例,其中规定了固定的行宽度。


1
您可以在问题下方使用“标记”链接将其标记为重复问题。 - Jeremy Caney
2
感谢您的反馈@JeremyCaney。在这种情况下,由于两篇帖子都已经接近10年了,是否有意义呢?最“新”的应该被标记吗?无论如何,目前我的声望似乎太低了,无法标记问题。 - letax

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