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

StackOverflow https://stackoverflow.com/questions/4596962

  •  15-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь отобразить простой график, используя Pydot.

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

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


Кроме того, в качестве обновления я хотел бы задать в том же вопросе, что я заметил, что, хотя изображение сохраняется очень быстро, когда я использую команду Show of модуля изображения, требуется заметное время, чтобы изображение было видно .... также иногда Я получаю ошибку, что изображение не может быть открыто, потому что оно было удалено или сохранено в недоступном месте, которое не правильно, поскольку я сохраняю его на своем рабочем столе ..... кто -нибудь знает, что происходит, и есть более быстрее. Чтобы загрузить изображение .....

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

Это было полезно?

Решение

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

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

Другие советы

Вы можете отобразить изображение из pydot позвонив GraphVizS. 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 на обмене файла Интерфейс Graphviz, Макет Matlab Graphviz импортер, 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 из Библиотека Imaging Python

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top