37

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

digraph g { 

building_color = "red"
land_color = "green"

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

}

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

4

3 回答 3

30

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

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

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

不支持实变量。


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

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

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

这个这个SO 答案包含gvpr脚本示例。

于 2013-02-02T13:12:45.277 回答
26

最简单的解决方案是使用m4-通用的文本到文本预处理器

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"]
}
于 2015-05-20T07:37:15.053 回答
0

您可以使用graphviz-py,它允许您在 Graphviz 图表中执行 Python 代码。

例子

digraph g {
{{
building_color = "red"
land_color = "green"
}}

node[style=filled]

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

}

输出

输出

于 2022-02-15T18:57:10.213 回答