Visualizzare grafico senza salvataggio utilizzando pydot
Domanda
Sto cercando di visualizzare un grafico semplice utilizzando pydot.
La mia domanda è che esiste un modo per visualizzare il grafico senza scrivere in un file come attualmente utilizzare la funzione di scrittura per primo pareggio e quindi è necessario utilizzare il modulo immagine per visualizzare i file.
Tuttavia esiste un modo che il grafico venga stampato direttamente sullo schermo senza essere salvato ??
Anche come un aggiornamento vorrei chiedere in questa stessa domanda che osservo che, mentre l'immagine viene salvato molto rapidamente quando uso il comando show del modulo Immagine ci vuole tempo notevole per l'immagine di essere visto ... . Inoltre a volte ho l'errore che l'immagine non potremmo essere aperto perché è stato eliminato o salvato in posizione non disponibile, che non è corretto come sto salvandolo al mio desktop ..... qualcuno sa che cosa sta accadendo ed è lì un modo più veloce per ottenere l'immagine caricata .....
Grazie mille ....
Soluzione
Sono usi pydot
paura graphviz
per rendere i grafici. Vale a dire, viene eseguito il file eseguibile e carica l'immagine risultante.
Linea di fondo -. No, non è possibile evitare di creare il file
Altri suggerimenti
Si può rendere l'immagine da pydot
chiamando GraphViz
di dot
senza scrivere alcun file sul disco. Poi basta tracciare esso. Questo può essere fatto come segue prendendo g
è un grafico 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)
Questo è particolarmente utile per i grafi orientati, perché le capacità di matplotlib
networkx
sono fortemente limitate per tali grafici.
Si veda anche questo tirare richiesta , che introduce tali capacità direttamente a networkx
. Ciò che rimane è per qualcuno di scrivere un'interfaccia per il carico e tracciare il layout generato dalle GraphViz
come quelle per MATLAB
su File Scambio GraphViz interfaccia , MATLAB GraphViz layout importatore , GraphViz4Matlab
.
Ecco una soluzione semplice utilizzando IPython:
from IPython.display import Image, display
def view_pydot(pdot):
plt = Image(pdot.create_png())
display(plt)
Esempio di utilizzo:
import networkx as nx
to_pdot = nx.drawing.nx_pydot.to_pydot
pdot = to_pdot(nx.complete_graph(5))
view_pydot(pdot)
In base a questa risposta (come mostrare immagini in pitone), ecco qualche riga:
gr = ... <pydot.Dot instance> ...
import tempfile, Image
fout = tempfile.NamedTemporaryFile(suffix=".png")
gr.write(fout.name,format="png")
Image.open(fout.name).show()
Image
è dal Python Imaging Library