Graphviz 中的自动多行标签?

问题描述 投票:0回答:4

我正在使用 Graphviz 绘制一些图表。我在节点上使用标签,我可以输入

"\n"
来强制它将标签分成两行。有没有办法让 Graphviz(或我正在使用的
dot
)自动看到它应该分割一些节点标签,并让它本身自动做出最佳选择?

graphviz
4个回答
29
投票

是的,类似 HTML 的标签 (

<...>
) 支持
标签,使用它可以换行。例如

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

在 LaTeX 中嵌入 Graphviz 时,这些也可以工作,而

\n
则不行。


14
投票

我也搜索过这个,但我认为在当前版本中不可能。当前的“解决方案”是编写自动添加“ “每隔几个字符,基于节点之间的最小距离(

nodesep
属性,如果我没记错的话)。


5
投票

有人编写了一个 Perl 脚本来实现这一目标。我在他的博客中找到了它:用点文本换行(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

之前: 之后:


2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.