Узлы с разными формами в pygraphviz - PullRequest
0 голосов
/ 05 января 2020

Я пытаюсь визуализировать автомат в pygraphviz, как пример в документации GraphViz :

Finite Automaton example in graphviz docs

Я нашел этот узел формы могут быть изменены следующим образом:

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

Это меняет форму всех узлов, но я хочу использовать разные формы узлов для разных узлов (некоторые 'circle' и некоторые 'doublecircle'). Любой совет для этого?

Примечание: я использую pygraphviz, потому что я хочу использовать networkx графические объекты, и они могут быть преобразованы в AGraph объекты pygraphviz. Кроме того, очевидно, networkx не может создавать графические визуализации, подобные этой.

Ответы [ 2 ]

1 голос
/ 05 января 2020

Каждый узел в графе является экземпляром класса Node, а атрибуты узлов задаются с помощью ItemAttribute. Это означает, что вы можете изменить атрибуты узлов отдельно. Таким образом, вам нужно только получить доступ к узлам. Это возможно против iternodes, итератора на узлах AGraph. Вот пример использования networkx и pygraphviz вместе и изменения атрибутов узла:

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')
0 голосов
/ 05 января 2020

Вся информация содержится в документации pygraphviz (http://pygraphviz.github.io/documentation/pygraphviz-1.5/tutorial.html#nodes -and-ребра ) в атрибуте абзаца, в котором говорится:

Чтобы установить атрибуты по умолчанию для графов, узлов и ребра используют словари graph_attr, node_attr и edge_attr

G.graph_attr ['label'] = 'Имя графа G.node_attr [' shape '] = 'circle' G.edge_attr ['color'] = 'red'

Атрибуты графика могут быть установлены при инициализации графика

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

Атрибуты можно добавлять при добавлении узлов или ребер,

G.add_node (1, цвет = 'красный') G.add_edge ('b', 'c', цвет = 'синий')

или через словари узлов или ребер,

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

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

...