我正在使用Graphviz绘制一些图形。我在节点上使用标签,并可以输入
"\n"
来强制将标签拆分成两行。是否有一种方法让Graphviz(或我正在使用的dot
)自动识别应该拆分某些节点标签,并自动做出最佳选择呢?是的,类似 HTML 的标签(<...>
)支持
标签,使用它可以换行。例如:
是的,类似 HTML 的标签(<...>
)支持
标签,使用它可以换行。例如:
"A" -> "B"
[label = <1. <br/> 2. <br/> 3. <br/> 4. <br/> .... <br/> > color="blue" style="dashed"];
这些方法在将Graphviz嵌入LaTeX中时也适用,而\n
则不行。
我也搜索过这个问题,但我认为在当前版本中不可能实现。目前的“解决方案”是编写代码,根据节点之间的最小距离(nodesep
属性,如果我没有记错的话),每隔几个字符自动添加"\n"。
<...>
引用而不是“...”
),这些标记不会自动换行,但比\n
更能控制布局。也许结合计算渲染后字符串长度的系统图形库的估计,可以猜测出在哪里放置断点比较好? - Jason Kleban⚠ 注意
仅当标签格式为
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
之前:
之后: