Отображение графика без сохранения с помощью pydot

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

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

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


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

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

4 ответов


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

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


вы можете отобразить изображение из pydot по телефону GraphViz ' s 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 are сильно ограничен для такой графы.

см. также pull-запрос, который вводит такие возможности непосредственно в networkx. Что остается для кого-то, чтобы написать интерфейс для загрузки и построения макета, сгенерированного GraphViz как к MATLAB на файловом обмене интерфейс GraphViz, MATLAB GraphViz макет импортера, GraphViz4Matlab.


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

from IPython.display import Image, display

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

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

import networkx as nx
toPdot = nx.drawing.nx_pydot.to_pydot
pdot = toPdot(nx.complete_graph(5))
viewPydot(pdot)

на основе ответ (как показать изображения в 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