pygraphviz 中不同形状的节点

Nodes with different shapes in pygraphviz

我正在尝试在 pygraphviz 中可视化一个自动机,例如 graphviz documentation 中的示例:

我发现节点形状可以像这样改变:

A.node_attr['shape']='circle' # A is a pygraphviz AGraph

这会改变所有节点的形状,但我想为不同的节点(一些 'circle' 和一些 'doublecircle')使用不同的节点形状。有什么建议吗?

注意:我正在使用 pygraphviz 因为我想使用 networkx 图形对象并且这些对象可以转换为 pygraphvizAGraph 对象].此外,显然 networkx 无法生成这样的图形可视化。

所有信息都包含在 pygraphviz 文档 (http://pygraphviz.github.io/documentation/pygraphviz-1.5/tutorial.html#nodes-and-edges) 的属性段落中,其中指出:

要设置图、节点和边的默认属性,请使用 graph_attr、node_attr 和 edge_attr 字典

G.graph_attr['label']='Name of graph' G.node_attr['shape']='circle' G.edge_attr['color']='red'

可以在初始化图的时候设置图的属性

G=pgv.AGraph(ranksep='0.1')

添加节点或边时可以添加属性,

G.add_node(1, color='red') G.add_edge('b','c',color='blue')

或通过节点或边属性字典,

n=G.get_node(1) n.attr['shape']='box'

e=G.get_edge('b','c') e.attr['color']='green'

图中的每个节点都是 Node class 的实例,节点属性设置为 ItemAttribute。这意味着您可以单独更改节点的属性。因此,您只需要访问节点。与 iternodes 相比,这是可能的,它是 AGraph 节点上的迭代器。下面是一起使用 networkxpygraphviz 并更改节点属性的示例:

import networkx as nx
import pygraphviz as pgv

G = nx.DiGraph()

nodes = {'a', 'b', 'c'}
edges = {('a', 'b'), ('b', 'c'), ('a', 'c')}

G.add_nodes_from(nodes)
G.add_edges_from(edges)

A = nx.nx_agraph.to_agraph(G)

shapes = ['circle', 'box']
for i, node in enumerate(A.iternodes()):
        node.attr['shape'] = shapes[i%2]
A.layout()
A.draw('graph.png')