Ответ 1
Я боюсь, что pydot
использует graphviz
для рендеринга графиков. I.e., он запускает исполняемый файл и загружает полученное изображение.
Нижняя строка - нет, вы не можете избежать создания файла.
Я пытаюсь отобразить простой граф, используя pydot.
Мой вопрос в том, что есть какой-либо способ отобразить график, не записывая его в файл, поскольку в настоящее время я использую функцию записи для первого рисования, а затем должен использовать модуль Image для отображения файлов.
Однако есть ли какой-либо способ, чтобы график непосредственно печатался на экране без сохранения??
Также как обновление, я хотел бы задать в этом же вопросе, что я заметил, что, хотя изображение быстро сохраняется, когда я использую команду show модуля Image, требуется время, чтобы изображение было видно... Также иногда я получаю ошибку, что изображение не может быть открыто, потому что оно было либо удалено, либо сохранено в недоступном месте, что неверно, поскольку я сохраняю его на своем рабочем столе..... Кто-нибудь знает, что происходит и есть более быстрый способ загрузки изображения.....
Большое спасибо....
Я боюсь, что pydot
использует graphviz
для рендеринга графиков. I.e., он запускает исполняемый файл и загружает полученное изображение.
Нижняя строка - нет, вы не можете избежать создания файла.
Вы можете визуализировать изображение из 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
как GraphViz
для MATLAB
в интерфейсе обмена файлами GraphViz, MATLAB GraphViz Layout, GraphViz4Matlab
.
Вот простое решение с использованием 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)
Основываясь на этом ответе (как показать изображения на 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 Imaging Library