Отображать график без сохранения с помощью pydot - PullRequest
18 голосов
/ 04 января 2011

Я пытаюсь отобразить простой график с помощью pydot.

Мой вопрос заключается в том, есть ли способ отобразить график, не записывая его в файл, так как в настоящее время я использую функцию записи, чтобы сначала нарисовать, а затемиспользовать модуль Image, чтобы показать файлы.

Однако есть ли способ, чтобы график напрямую выводился на экран без сохранения ??


Также в качестве обновления я хотел бы задать этот же вопрос, который наблюдаючто, хотя изображение сохраняется очень быстро, когда я использую команду show модуля Image, требуется заметное время, чтобы изображение было видно .... Также иногда я получаю сообщение об ошибке, что изображение не может быть открыто, потому что оно было либоудален или сохранен в недоступном месте, что неверно, так как я сохраняю его на рабочем столе ..... Кто-нибудь знает, что происходит, и есть ли более быстрый способ загрузить изображение .....

Большое спасибо ....

Ответы [ 4 ]

21 голосов
/ 30 августа 2013

Вы можете визуализировать изображение из pydot, вызвав GraphViz dot, не записывая никаких файлов на диск.Тогда просто подготовьте это.Это можно сделать следующим образом, предполагая, что g является графиком pydot:

from cStringIO import StringIO

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import networkx as nx

# create a networkx graph
G = nx.MultiDiGraph()
G.add_nodes_from([1,2] )
G.add_edge(1, 2)

# convert from networkx -> pydot
pydot_graph = G.to_pydot()

# render pydot by calling dot, no file saved to disk
png_str = pydot_graph.create_png(prog='dot')

# treat the dot output string as an image file
sio = StringIO()
sio.write(png_str)
sio.seek(0)
img = mpimg.imread(sio)

# plot the image
imgplot = plt.imshow(img, aspect='equal')
plt.show(block=False)

Это особенно полезно для ориентированных графов, поскольку возможности matplotlib networkx серьезноограничено для таких графиков.

См. также этот запрос на получение , который предоставляет такие возможности непосредственно networkx.Осталось написать интерфейс для загрузки и печати макета, сгенерированного GraphViz, как для MATLAB в File Exchange Интерфейс GraphViz , MATLAB Импортер макетов GraphViz GraphViz4Matlab.

15 голосов
/ 07 апреля 2016

Вот простое решение с использованием IPython:

from IPython.display import Image, display

def view_pydot(pdot):
    plt = Image(pdot.create_png())
    display(plt)

Пример использования:

import networkx as nx
to_pdot = nx.drawing.nx_pydot.to_pydot
pdot = to_pdot(nx.complete_graph(5))
view_pydot(pdot)
3 голосов
/ 29 ноября 2012

На основании этого ответа (как показывать изображения в python) вот несколько строк:

gr = ... <pydot.Dot instance> ...

import tempfile, Image
fout = tempfile.NamedTemporaryFile(suffix=".png")
gr.write(fout.name,format="png")
Image.open(fout.name).show()

Image из библиотеки изображений Python

1 голос
/ 04 января 2011

Боюсь, pydot использует graphviz для визуализации графиков.Т.е. он запускает исполняемый файл и загружает полученное изображение.

Итог - нет, вы не можете избежать создания файла.

...