2011-01-04 18 views
13

Estoy tratando de mostrar un gráfico simple usando pydot.Mostrar gráfico sin guardar usando pydot

Mi pregunta es que hay alguna forma de mostrar el gráfico sin escribirlo en un archivo ya que actualmente uso la función de escritura para dibujar primero y luego tengo que usar el módulo de Imagen para mostrar los archivos.

Sin embargo, ¿hay alguna forma de que el gráfico se imprima directamente en la pantalla sin guardarlo?


también como una actualización me gustaría preguntar en esta misma pregunta que observo que mientras la imagen se guarda muy rápidamente cuando se utiliza el comando show del módulo La imagen se necesita tiempo apreciable para que la imagen sea visto ... También a veces me da el error de que la imagen no se puede abrir porque se eliminó o se guardó en una ubicación no disponible que no es correcta, ya que la estoy guardando en mi Escritorio ..... ¿Alguien sabe qué es? pasando y hay una manera más rápida para obtener la imagen cargada .....

Gracias mucho ....

+0

relacionadas: http://stackoverflow.com/questions/10379448/plotting-directed-graphs-in-python -in-a-way-that-show-all-edges-separately/17823100 # 17823100 –

Respuesta

2

me temo pydot usa graphviz para representar los gráficos. Es decir, ejecuta el ejecutable y carga la imagen resultante.

Conclusión: no, no puede evitar crear el archivo.

+1

¿hay alguna manera de abrir el archivo rápidamente pero ??? Muchas gracias por la respuesta –

+1

johntex proporcionó una solución – elgehelge

+0

echa un vistazo a mi solución. es simple y evita crear un archivo :) – micahscopes

3

Basado en this answer (cómo mostrar imágenes en Python), aquí hay unas pocas líneas:

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

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

Image es desde el Python Imaging Library

17

Puede representar la imagen de pydot llamando GraphViz 's dot sin escribir ningún archivo en el disco. Entonces solo complétalo. Esto puede hacerse como sigue, suponiendo g es un gráfico 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) 

Esto es particularmente útil para gráficos dirigidos, porque los matplotlib capacidades de networkx son severely limited para tales gráficos.

Vea también este pull request, que presenta dichas capacidades directamente en networkx. Lo que resta es que alguien escriba una interfaz para cargar y trazar el diseño generado por GraphViz como los de MATLAB en el intercambio de archivos GraphViz interface, MATLAB GraphViz Layout importer, GraphViz4Matlab.

+3

Al igual que una adición rápida, si estás en un cuaderno, puedes representar 'png_str' (bytes) directamente usando' Imagen (png_str) '(desde' IPython.display'). – meloncholy

+0

Se hicieron algunos ajustes menores en esta adaptación: https://github.com/EricCousineau-TRI/repro/blob/d74ecbd4fdfdaa115bf28b2db15c7e296553435d/python/matplotlib/graphviz.py#L9 ¡Gracias por publicar este código! (Terminó simplemente usando 'pydot', ya que fue capaz de manejar el gráfico de interés en este caso). –

+1

@EricCousineau Con la instrucción' g = pydot.graph_from_dot_data (dot_text) 'parece que está usando un' pydot antiguo 'versión. Tenga en cuenta que a partir de 'pydot == 1.2.3', la función' graph_from_dot_data' devuelve una 'list' en todos los casos (en versiones anteriores devolvía un gráfico cuando singleton). Ver también [este comentario] (https://github.com/erocarrera/pydot/issues/159#issuecomment-334799706), y https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/pydot.py#L235 , https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/dot_parser.py#L545. –

6

he aquí una solución sencilla utilizando IPython:

from IPython.display import Image, display 

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

Ejemplo de uso:

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