【问题标题】:graphviz: change color of some nodesgraphviz:更改某些节点的颜色
【发布时间】:2022-02-14 01:56:43
【问题描述】:

我正在使用NetworkX 解析一个图形,并使用graphviz 将同一图形表示为svg 文件。我正在尝试根据节点名称为图表的每个节点着色,例如:

if node.name == 'abc':
  node.color = 'blue'
else:
  node.color = 'pink'

我能够用相同的颜色为图表的每个节点着色,但我无法根据我之前的算法设置条件以具有不同的节点颜色。

根据这篇 StackOverflow 帖子Graphviz dot: How to change the colour of one record in multi-record shape,这可能是不可能的。但是我看.dot的输出文件,每个节点都是一个颜色属性所以应该可以改吧?

graph.dot:

digraph "" {
    graph [bb="0,0,61610,509.51",
        edge_default="{}",
        edges="{'arrowsize': '4.0'}",
        node_default="{}",
        rankdir=TD
    ];
    node [fillcolor=red,
        label="\N",
        shape=rectangle,
        style=filled
    ];
    "gold_adhoc_demand_review.countries"    [color=red,
        height=0.5,
        kind=adhoc,
        pos="1010,234",
        table=countries,
        use_case=demand_review,
        width=3.1389,
        zone=gold];
    "gold_core.location"    [color=blue,
        height=0.5,
        kind=core,
        pos="868,306",
        table=location,
        width=1.6389,
        zone=gold];
    "gold_core.location" -> "gold_adhoc_demand_review.countries"    [pos="e,975.13,252.19 902.74,287.88 921.82,278.47 945.68,266.71 966.05,256.67"];
    "gold_adhoc_product_priorities.distribution_network"    [color=red,
        height=0.5,
        kind=adhoc,
        pos="150,234",
        table=distribution_network,
        use_case=product_priorities,
        width=4.1667,
        zone=gold];
    "gold_core.location" -> "gold_adhoc_product_priorities.distribution_network"    [pos="e,300.22,251.11 808.82,299.62 708.56,290.46 498.65,271.06 310.31,252.13"];
    "gold_adhoc_global_supply_review.country"   [color=red,
        height=0.5,
        kind=adhoc,
        pos="1267,234",
        table=country,
        use_case=global_supply_review,
        width=3.4861,
        zone=gold];
...

draw.py

def draw_graph(networkx_graph):
    networkx_graph.graph['graph'] = {'rankdir': PYGRAPHIZ_RANKDIR}
    networkx_graph.graph['node'] = {'shape': PYGRAPHIZ_SHAPE_TYPE, 'fillcolor': 'red', 'style':'filled'}
    networkx_graph.graph['edges']={'arrowsize': PYGRAPHIZ_ARROW_SIZE}
    pygraphviz_graph = to_agraph(networkx_graph)
    pygraphviz_graph.layout("svg")
    pygraphviz_graph.draw("result.svg")
    print(pygraphviz_graph.graph_attr)

【问题讨论】:

    标签: svg graphviz


    【解决方案1】:

    您要更新的属性是fillcolor,而不是colorcolor 控制节点的边框。

    (请参阅https://graphviz.org/docs/attrs/fillcolor/ 的文档)

    自定义各个节点的填充颜色的逻辑如下所示:

    if node.name == 'abc':
      node.fillcolor = 'gold'
    else:
      node.fillcolor = 'pink'
    

    注意:您可以使用 RGB 颜色代码而不是名称来为您提供更多选择,例如:fillcolor = "#ffd700"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2013-11-30
      • 2020-04-10
      • 2023-03-12
      • 2012-05-01
      • 2012-11-24
      相关资源
      最近更新 更多