Graphviz / Python:生成单个节点后重新着色

时间:2017-06-02 20:45:23

标签: python graphviz

我熟悉Python 2.7中的graphviz。是否可以在绘制单个节点后更改其属性?

e.g。

from graphviz import Digraph
q = Digraph()
q.node('a')
q.node('b')
q.edge('a','b')

q

Output of simple graph

事后可以改变节点'b'的颜色吗?我知道我可以在生成时通过

设置它
q.node('b', color = 'blue')

但是,我希望能够在生成后更改它。

此链接Color a particular node in Networkx and Graphviz

建议使用图形的.node属性来更新字典

G.node[2]['fillcolor']='red'

通过类比,我试过

q.node['b']['color'] = 'blue'

给出错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-54-43b05071d09a> in <module>()
----> 1 q.node['b']['color'] = 'blue'

TypeError: 'instancemethod' object has no attribute '__getitem__'

我认为这可能是因为我没有像前一种情况那样使用networkx。

我还在http://graphviz.org/content/attrs阅读了graphviz文档 但我的实验都没有奏效。我确信这是直截了当但我错过了......

---俱乐部里的老家伙

4 个答案:

答案 0 :(得分:2)

我已经阅读了API文档,并且认为在构建之后编辑节点是不可能的。

如果您不想使用networkx,一种解决方法是将图表存储在您自己的数据结构中,并使用它在您准备好的时候创建graphviz图表(重新)渲染它。例如,您可以保留所有应该为蓝色的节点的名称列表,然后在构建graphviz图时参考该列表。以这种方式将模型与其渲染分离也可以使维护更容易。

答案 1 :(得分:0)

一种方法是直接编辑图形对象。

>>> from graphviztest import *
>>> import json
>>> dot = Digraph(comment='My graph', format='png')
>>> dot.node('A', 'hurr')
>>> dot.node('B', 'durr')
>>> dot.edge('A','B')
>>> print dot
// My graph
digraph {
    A [label=hurr]
    B [label=durr]
    A -> B
}
>>> print json.dumps(dot.__dict__, indent=2)
{
  "comment": "My graph", 
  "_encoding": "utf-8", 
  "name": null, 
  "edge_attr": {}, 
  "_format": "png", 
  "body": [
    "\tA [label=hurr]", 
    "\tB [label=durr]", 
    "\tA -> B"
  ], 
  "filename": "Digraph.gv", 
  "graph_attr": {}, 
  "strict": false, 
  "node_attr": {}
}
>>> dot.body[0] = '\tA [label=derp]'
>>> dot.body[1] = '\tB [label=blah]'
>>> print dot
// My graph
digraph {
    A [label=derp]
    B [label=blah]
    A -> B
}
>>> 


答案 2 :(得分:0)

您还可以将生成的图形保存在 SVG 中并直接编辑 SVG,使用 CSS 更改给定节点的颜色。在 SVG 中,生成的节点有 id,可以很容易地改变颜色(笔触属性)。

答案 3 :(得分:0)

如果您将输出格式设置为 dot,则会计算布局,但不会实际绘制。 然后,您可以使用 Python、sed、awk 或 gvpr (https://www.graphviz.org/pdf/gvpr.1.pdf) 修改该(增强的)Graphviz 文件以修改颜色和/或其他属性。
然后使用此命令绘制图形:neato -n2 -Tpng myfile.dot >myfile.png
有关延迟绘图的更多信息,请参见此处:https://www.graphviz.org/faq/#FaqDotWithCoordsor