Установка атрибутов графа в pygraph - PullRequest
2 голосов
/ 12 апреля 2011

Я нашел в документации pygraph , как изменить атрибуты узлов и ребер , но я не нашел помощи в том, как изменить атрибуты графиков.

Я попытался без удачи:

gr = graph()
gr.__setattr__('aspect',2)

Что вы порекомендуете?

Спасибо!

[обновить] Я также попробовал:

gr = graph()
gr.__setattr__('rotate',90)
gr.rotate = 90
gr.color = 'red'
setattr(gr,'bgcolor','red')

[обновление 2] Пример кода с сайта с различными идеями для изменения атрибутов:

#!/usr/bin/env python

# Copyright (c) 2007-2008 Pedro Matiello <pmatiello@gmail.com>
# License: MIT (see COPYING file)

# Import graphviz
import sys
sys.path.append('..')
sys.path.append('/usr/lib/graphviz/python/')
sys.path.append('/usr/lib64/graphviz/python/')
import gv

# Import pygraph
from pygraph.classes.graph import graph
from pygraph.classes.digraph import digraph
from pygraph.algorithms.searching import breadth_first_search
from pygraph.readwrite.dot import write

# Graph creation
gr = graph()

gr.__setattr__('rotate',90)
gr.rotate = 90
gr.color = 'red'
setattr(gr,'bgcolor','red')

# Add nodes and edges
gr.add_nodes(["Portugal","Spain","France","Germany","Belgium","Netherlands","Italy"])
gr.add_nodes(["Switzerland","Austria","Denmark","Poland","Czech Republic","Slovakia","Hungary"])
gr.add_nodes(["England","Ireland","Scotland","Wales"])

gr.add_edge(("Portugal", "Spain"))
gr.add_edge(("Spain","France"))
gr.add_edge(("France","Belgium"))
gr.add_edge(("France","Germany"))
gr.add_edge(("France","Italy"))
gr.add_edge(("Belgium","Netherlands"))
gr.add_edge(("Germany","Belgium"))
gr.add_edge(("Germany","Netherlands"))
gr.add_edge(("England","Wales"))
gr.add_edge(("England","Scotland"))
gr.add_edge(("Scotland","Wales"))
gr.add_edge(("Switzerland","Austria"))
gr.add_edge(("Switzerland","Germany"))
gr.add_edge(("Switzerland","France"))
gr.add_edge(("Switzerland","Italy"))
gr.add_edge(("Austria","Germany"))
gr.add_edge(("Austria","Italy"))
gr.add_edge(("Austria","Czech Republic"))
gr.add_edge(("Austria","Slovakia"))
gr.add_edge(("Austria","Hungary"))
gr.add_edge(("Denmark","Germany"))
gr.add_edge(("Poland","Czech Republic"))
gr.add_edge(("Poland","Slovakia"))
gr.add_edge(("Poland","Germany"))
gr.add_edge(("Czech Republic","Slovakia"))
gr.add_edge(("Czech Republic","Germany"))
gr.add_edge(("Slovakia","Hungary"))

# Draw as PNG
dot = write(gr)
gvv = gv.readstring(dot)
gv.layout(gvv,'dot')
gv.render(gvv,'png','europe.png')

Ответы [ 4 ]

3 голосов
/ 09 февраля 2013

Очевидно, вы можете использовать gv.setv() для установки атрибутов на графике.

import gv
g = gv.digraph('19261920')
gv.setv(g, 'overlap', 'compress')

Я нашел gv.setv(), изучив файл определения интерфейса gv.py в /usr/include/graphviz/gv.i

Поиск в интернете "import gv" overlap setv привел меня к этому старому посту , который демонстрирует использование gv.setv().

И я нашел эту PDF страницу руководства gv_python , которая содержит больше документации по setv.

Это довольно много для такой простой вещи, а?

1 голос
/ 13 апреля 2011

Итак, проведя больше собственных исследований, я обнаружил, что pygraphviz предлагает то, что мне нужно.Вот пример pygraph, использующий pygraphviz и принимающий атрибуты.Это также короче, так как вам не нужно указывать узлы, если все они соединены через ребра.

#!/usr/bin/env python

# Copyright (c) 2007-2008 Pedro Matiello <pmatiello@gmail.com>
# License: MIT (see COPYING file)

# Import pygraphviz
import pygraphviz as pgv

# Graph creation and setting of attributes
gr = pgv.AGraph(rotate='90',bgcolor='lightgray')

# Add nodes and edges
gr.add_edge(("Portugal", "Spain"))
gr.add_edge(("Spain","France"))
gr.add_edge(("France","Belgium"))
gr.add_edge(("France","Germany"))
gr.add_edge(("France","Italy"))
gr.add_edge(("Belgium","Netherlands"))
gr.add_edge(("Germany","Belgium"))
gr.add_edge(("Germany","Netherlands"))
gr.add_edge(("England","Wales"))
gr.add_edge(("England","Scotland"))
gr.add_edge(("Scotland","Wales"))
gr.add_edge(("Switzerland","Austria"))
gr.add_edge(("Switzerland","Germany"))
gr.add_edge(("Switzerland","France"))
gr.add_edge(("Switzerland","Italy"))
gr.add_edge(("Austria","Germany"))
gr.add_edge(("Austria","Italy"))
gr.add_edge(("Austria","Czech Republic"))
gr.add_edge(("Austria","Slovakia"))
gr.add_edge(("Austria","Hungary"))
gr.add_edge(("Denmark","Germany"))
gr.add_edge(("Poland","Czech Republic"))
gr.add_edge(("Poland","Slovakia"))
gr.add_edge(("Poland","Germany"))
gr.add_edge(("Czech Republic","Slovakia"))
gr.add_edge(("Czech Republic","Germany"))
gr.add_edge(("Slovakia","Hungary"))

# Draw as PNG
gr.layout(prog='dot')
gr.draw('europe.png')
0 голосов
/ 23 января 2014

Попробуйте следующее

import pydot

dot = write(gr)
dotG = pydot.graph_from_dot_data(dot)
params = { 'rotate': 10, 'color': 'red'}
dotG.set_graph_defaults(**params)
dot = dotG.to_string()
0 голосов
/ 12 апреля 2011

Я не знаю насчет pygraph, но я думаю, что вы задали атрибуты в python:

setattr(object, attr, value)
setattr(gr, 'aspect', 2)

Я имею в виду, вы пробовали gr.aspect = 2, верно?

...