Afficher le graphique sans enregistrer à l'aide pydot
Question
Je suis en train d'afficher un graphique simple à l'aide pydot.
Ma question est que est-il possible d'afficher le graphique sans l'écrire dans un fichier comme actuellement j'utiliser la fonction d'écriture au premier tirage au sort et ensuite utiliser le module d'image pour afficher les fichiers.
est cependant il possible que le graphique s'imprimé directement sur l'écran sans être sauvé ??
De plus comme une mise à jour, je voudrais demander à cette même question que je remarque que si l'image est enregistré très rapidement lorsque j'utilise la commande show du module d'image il faut du temps notable pour l'image à voir ... . parfois aussi je reçois l'erreur que l'image could'nt être ouvert car il a été supprimé ou enregistré dans l'emplacement indisponible qui ne sont pas correctes, je gardais mon bureau ..... est-ce que quelqu'un sait ce qui se passe et est là un moyen plus rapide pour obtenir l'image chargée .....
Merci beaucoup ....
La solution
Je suis utilisations pydot
peur graphviz
pour rendre les graphiques. À savoir, il exécute le fichier exécutable et charge l'image résultante.
En bout de ligne. - Non, vous ne pouvez pas éviter de créer le fichier
Autres conseils
Vous pouvez rendre l'image de pydot
en appelant GraphViz
de dot
sans écrire des fichiers sur le disque. Ensuite, il suffit de tracer il. Cela peut se faire comme suit, en supposant g
est un graphique de 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)
Ceci est particulièrement utile pour les graphes orientés, parce que les capacités de matplotlib
de networkx
sont sévèrement limité pour ces graphiques.
Voir aussi cette demande traction , qui introduit de telles capacités directement à networkx
. Ce qui reste est pour quelqu'un d'écrire une interface à la charge et tracer la mise en page générée par GraphViz
que ceux pour MATLAB
sur Exchange fichier GraphViz Interface , importateur Matlab GraphViz mise en page , GraphViz4Matlab
.
Voici une solution simple en utilisant IPython:
from IPython.display import Image, display
def view_pydot(pdot):
plt = Image(pdot.create_png())
display(plt)
Exemple d'utilisation:
import networkx as nx
to_pdot = nx.drawing.nx_pydot.to_pydot
pdot = to_pdot(nx.complete_graph(5))
view_pydot(pdot)
Basé sur cette réponse (comment afficher des images en python), voici quelques lignes:
gr = ... <pydot.Dot instance> ...
import tempfile, Image
fout = tempfile.NamedTemporaryFile(suffix=".png")
gr.write(fout.name,format="png")
Image.open(fout.name).show()
Image
est de la Python Imaging Library