我正在使用 Graphviz 绘制一些图表。我在节点上使用标签,我可以输入
"\n"
来强制它将标签分成两行。有没有办法让 Graphviz(或我正在使用的 dot
)自动看到它应该分割一些节点标签,并让它本身自动做出最佳选择?
是的,类似 HTML 的标签 (
<...>
) 支持 "A" -> "B"
[label = <1. <br/>
2. <br/>
3. <br/>
4. <br/>
.... <br/>
> color="blue" style="dashed"];
在 LaTeX 中嵌入 Graphviz 时,这些也可以工作,而
\n
则不行。
我也搜索过这个,但我认为在当前版本中不可能。当前的“解决方案”是编写自动添加“ “每隔几个字符,基于节点之间的最小距离(
nodesep
属性,如果我没记错的话)。
有人编写了一个 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
之前: 之后: