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

6

我正在学习在Python 2.7中使用graphviz。在绘制完一个节点后,是否可以更改单个节点的属性?

例如:

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

q

简单图形的输出结果

是否可以事后更改节点“b”的颜色? 我知道我可以通过以下方式在生成时设置:

q.node('b', color = 'blue')

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

这个链接在Networkx和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。我也阅读了graphviz文档(http://graphviz.org/content/attrs),但我的所有实验都失败了。我相信这是一些简单的东西,但我却错过了它... --- 俱乐部里的老人
4个回答

4
我已经阅读了 API 文档,并认为在构建后无法编辑节点。
如果您不想使用 NetworkX,则一种解决方法是将图形存储在自己的数据结构中,并在准备(重新)渲染时使用该数据结构创建 Graphviz 图形。例如,您可以保留应为蓝色的所有节点名称的列表,然后在构建 Graphviz 图形时引用该列表。以这种方式分离模型和其呈现可能还会导致更轻松的维护。

我尝试了一些使用networkx的实验 - 它有一些非常好的功能,但是我想到的一些事情似乎比纯图形可视化更复杂。你提出将节点类别批量更新的想法听起来是我最终想做的事情的一个不错的方法。我会尝试这种路线。感谢您的及时回复。 - user4048937

0
你也可以将生成的图形保存为SVG,并直接编辑SVG,使用CSS更改给定节点的颜色。在SVG中,生成的节点有id,因此很容易更改颜色(描边属性)。

0

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
}
>>> 



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接