【问题标题】:Does the DOT language support variables / aliases?DOT 语言是否支持变量/别名?
【发布时间】:2022-02-16 03:03:29
【问题描述】:

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

digraph g { 

building_color = "red"
land_color = "green"

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

}

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

【问题讨论】:

    标签: graphviz


    【解决方案1】:

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

    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 属性中,并让您的脚本根据该属性的内容执行操作。

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

    【讨论】:

    • barn --> farm; 这是一个错字还是我不知道的某些功能? -> barn -> farm; ?
    【解决方案2】:

    最简单的解决方案是使用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"]
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用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 }}]
      
      }
      

      输出

      【讨论】:

        猜你喜欢
        • 2013-10-26
        • 2017-08-03
        • 1970-01-01
        • 2016-10-22
        • 2021-04-13
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多