我正在使用Graphviz(即Dot)为我正计划构建的超媒体API绘制状态机.在我的图中,节点表示状态,而边表示链接.我想要做的是拥有相同"类型"的边(链接)(即,使用相同的动词或相同的rel)来共享属性,如color.
我知道你可以定义适用于所有节点/边缘的"全局"属性,但是我需要一些我可以更普遍地应用于几种不同"类型"的东西.我能想出的最接近的类比是HTML类.我的边缘不需要多个"类"(虽然这样会很好)但重复属性就像color=red, style=bold是很麻烦.
Dot中有没有办法宣布这样的东西?或者至少在某种程度上我不必经常重复自己?
我用两种不同的方式做到了这一点:
选项(A):dot从另一个脚本写入文件.当我使用脚本(例如,Python或Perl)将输入数据重新编写dot为绘图格式时,这尤其有用.在这种情况下,除了让Python脚本将数据写入dot格式之外,我还可以让它将每个节点和边缘的属性写入dot文件.下面显示了一个示例(不可运行,因为我从一个解释输入数据的较大脚本中提取它,但您可以看到Perl是如何编写dot代码的).
print "graph G {\n graph [overlap = scale, size = \"10,10\"]; node [fontname = \"Helvetica\", fontsize = 9]\n";
for ($j = 0; $j <= $#sectionList; $j++) {
print "n$j [label = \"$sectionList[$j]\", style = filled, fillcolor = $groupColour{$group{$sectionList[$j]}} ]\n";
}
for ($j = 0; $j <= $#sectionList; $j++) {
for ($i = $j+1; $i <= $#sectionList; $i++) {
$wt = ($collab{$sectionList[$j]}{$sectionList[$i]}+0)/
($collab{$sectionList[$j]}{$sectionList[$j]}+0);
if ($wt > 0.01) {
print "n$j -- n$i [weight = $wt, ";
if ($wt > 0.15) {
print "style = bold]\n";
}
elsif ($wt > 0.04) {
print "]\n";
} else {
print "style = dotted]\n";
}
}
}
print "\n";
}
print "}\n";
Run Code Online (Sandbox Code Playgroud)
选项(B):如果我dot手动编写脚本,我将使用宏处理器来定义公共元素.例如,给定polygon.dot.m4包含m4宏的文件define()如下:
define(SHAPE1,square)
define(SHAPE2,triangle)
digraph G {
a -> b -> c;
b -> d;
a [shape=SHAPE1];
b [shape=SHAPE2];
d [shape=SHAPE1];
e [shape=SHAPE2];
}
Run Code Online (Sandbox Code Playgroud)
......命令m4 <polygon.dot.m4 | dot -Tjpg -opolygon.jpg产生:

更改文件顶部的SHAPE1和SHAPE2的定义将更改为每个相关节点绘制的形状.
| 归档时间: |
|
| 查看次数: |
1352 次 |
| 最近记录: |