DOT语言是否支持变量/别名?

时间:2013-02-02 12:54:45

标签: graphviz

我正在尝试打印有向图,并且我不断更改各种节点属性,例如颜色和形状。有没有办法使用一次定义并用于多个节点的变量?理想情况下,我喜欢这样的事情:

digraph g { 

building_color = "red"
land_color = "green"

farm  [ fillcolor=land_color]
barn  [ fillcolor=building_color]
house  [ fillcolor=building_color]

}

所以我可以改变建筑颜色一次,而不必去每个节点。这可能吗?

2 个答案:

答案 0 :(得分:18)

您可以定义默认值以避免重复:

digraph g{
   node[fillcolor=red];
   barn;
   house;
   ...
   node[fillcolor=green];
   farm;
   ...

   edge[color=red];
   barn -> house;
   edge[color=green];
   barn --> farm;
   house --> farm;
}

不支持Real 变量。


更复杂的解决方法是使用gvpr - 图形模式扫描和处理语言

gvpr读取和输出图表,允许添加和修改图形,节点和属性。

例如,您可以在comment属性中存储自定义信息,并让您的脚本根据此属性的内容进行操作。

Thisthis SO回答包含gvpr脚本的示例。

答案 1 :(得分:16)

最简单的解决方案是使用m4 - generic text-to-text preprocessor

SampleGraph.dot.m4

digraph g { 

   define(`building_style',`style=filled, fillcolor = "red"')
   define(`land_style',`style=filled, fillcolor = "green"')

   farm  [label="Farm", land_style]
   barn  [building_style]
   house [label="House", building_style]
}

运行m4 SampleGraph.dot.m4 > SampleGraph.dot

结果SampleGraph.dot

digraph g { 




   farm  [label="Farm", style=filled, fillcolor = "green"]
   barn  [style=filled, fillcolor = "red"]
   house [label="House", style=filled, fillcolor = "red"]
}