Graphviz中的自动多行标签?

时间:2009-09-25 09:54:31

标签: graphviz

我正在使用Graphviz绘制一些图表。我在节点上使用标签,我可以放入"\n"强制它将标签分成2行。有没有办法让Graphviz(或我正在使用的dot)自动看到它应该拆分一些节点标签,并为它自己做出最佳的自动选择?

4 个答案:

答案 0 :(得分:11)

是的,类似HTML的标签(<...>)支持
标签,使用它可以打破线条。 E.g。

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

将这些Graphviz嵌入LaTeX时也可以使用,\n不会。

答案 1 :(得分:10)

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

答案 2 :(得分:1)

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

dot2tex(胶乳+ graphviz)处理文字换行, 以及针对graphviz的排版限制的其他解决方法。 您会在this重复问题中找到一个简短示例, 具有规定的固定线宽。

答案 3 :(得分:1)

有人编写了一个 Perl 脚本来实现这一点。我在他的博客中找到了它:Text wrapping with dot (graphviz)

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

之前: 之后: