我在兩種不同的方式做到了這一點:
選項(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";
選項(B):如果我手寫的劇本dot
,我將使用一個宏處理器來定義的共同要素。例如,給定包含m4
宏define()
文件polygon.dot.m4
如下:
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];
}
...命令m4 <polygon.dot.m4 | dot -Tjpg -opolygon.jpg
生產:
在文件的頂端更改SHAPE1和SHAPE2的定義將改變爲每個相關節點繪製的形狀。
謝謝,我以前從未使用過M4。這很容易:) –
我推薦選項(B)。如果從Python/Perl等生成.dot文件,我建議使用模板庫而不是逐個構建字符串。 –