Graphviz/Python:在生成单个节点后重新对其进行排序

Graphviz/Python:在生成单个节点后重新对其进行排序,python,graphviz,Python,Graphviz,我逐渐熟悉了Python 2.7中的graphviz。是否可以在绘制单个节点后更改其属性 e、 g 是否可以在事件发生后更改节点“b”的颜色?我知道我可以在一代人的时候设置它 q.node('b', color = 'blue') 但是,我希望能够在生成它之后更改它 此链接 建议使用图形的.node属性更新dict G.node[2]['fillcolor']='red' 打个比方,我试过了 q.node['b']['color'] = 'blue' 这会产生一个错误: --------

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

e、 g

是否可以在事件发生后更改节点“b”的颜色?我知道我可以在一代人的时候设置它

q.node('b', color = 'blue')
但是,我希望能够在生成它之后更改它

此链接

建议使用图形的.node属性更新dict

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__'
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1 q.node['b']['color']='blue'
TypeError:“instancemethod”对象没有属性“\uuu getitem\uuu”
我想这可能是因为我没有像前一个案例那样使用networkx

我也读过graphviz的文档 但我的实验都没有成功。我相信这是很简单的事情,但我错过了


---俱乐部里的老家伙

我已经通读了API文档,认为不可能在构建后编辑节点


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

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

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



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

如果将输出格式设置为,则会计算布局,但不会实际绘制布局。 然后,您可以使用Python、sed、awk或gvpr()修改(增强的)Graphviz文件,以修改颜色和/或其他属性。
然后使用此命令绘制图形:
neato-n2-Tpng myfile.dot>myfile.png


有关延迟绘图的更多信息,请参见此处:

我尝试了networkx的一些实验-它有一些非常好的特性,但我想到的一些事情似乎比纯graphviz复杂一些。您将节点类别作为一个批更新的想法听起来是实现我最终想要做的事情的一个好方法。我试试那条路线。谢谢你的及时回复。
>>> 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
}
>>>