Graphviz/Python: 单个节点生成后重新着色
Graphviz/Python: Recoloring a single node after it has been generated
我在 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')
但是,我希望能够在生成后对其进行更改。
这个linkColor 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 文档
但是 none 我的实验成功了。我确定这很简单,但我想念它...
--- 俱乐部里的老家伙
我已经通读了 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,可以很容易地更改颜色(stroke 属性)。
如果您将输出格式设置为点,则计算布局,但不会实际绘制。
然后,您可以使用 Python、sed、awk 或 gvpr (https://www.graphviz.org/pdf/gvpr.1.pdf) 修改该(增强的)Graphviz 文件,以修改颜色 and/or 其他属性。
然后使用此命令绘制图形:neato -n2 -Tpng myfile.dot >myfile.png
有关延迟绘制的更多信息,请参见此处:https://www.graphviz.org/faq/#FaqDotWithCoordsor
我在 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')
但是,我希望能够在生成后对其进行更改。
这个linkColor 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 文档 但是 none 我的实验成功了。我确定这很简单,但我想念它...
--- 俱乐部里的老家伙
我已经通读了 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,可以很容易地更改颜色(stroke 属性)。
如果您将输出格式设置为点,则计算布局,但不会实际绘制。
然后,您可以使用 Python、sed、awk 或 gvpr (https://www.graphviz.org/pdf/gvpr.1.pdf) 修改该(增强的)Graphviz 文件,以修改颜色 and/or 其他属性。
然后使用此命令绘制图形:neato -n2 -Tpng myfile.dot >myfile.png
有关延迟绘制的更多信息,请参见此处:https://www.graphviz.org/faq/#FaqDotWithCoordsor