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 ....

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top