Frage

Ich versuche display ein einfaches Diagramm mit pydot.

Meine Frage ist, dass es eine Möglichkeit zur Darstellung von Graphen ohne das schreiben in eine Datei als aktuell verwende ich schreiben-Funktion zum ersten ziehen und dann verwenden Sie die Bild-Modul zum anzeigen der Dateien.

Jedoch gibt es eine Möglichkeit, dass der graph direkt gedruckt werden auf die Bildschirm, ohne die gespeichert ??


Auch als update möchte ich Fragen, in dieser gleichen Frage, die ich beobachten, dass, während das Bild gespeichert wird sehr schnell, wenn ich die "show" - Befehl von der Bild-Modul nimmt es spürbare Zeit für das Bild zu sehen ....Auch manchmal bekomme ich den Fehler, das Bild konnte nicht geöffnet werden, weil es entweder gelöscht oder gespeichert in nicht verfügbar, Standort ist nicht korrekt, da werde ich sparen, es auf meinem Desktop.....Weiß jemand, was passiert und gibt es einen schnelleren Weg, um das image geladen.....

Vielen Dank....

War es hilfreich?

Lösung

Ich fürchte pydot Verwendet graphviz Um die Grafiken zu rendern. Dh, es wird die ausführbare Datei ausgeführt und lädt das resultierende Bild.

Fazit - Nein, Sie können es nicht vermeiden, die Datei zu erstellen.

Andere Tipps

Sie können das Bild aus rendern pydot durch Anruf GraphViz's dot ohne Dateien auf die Festplatte zu schreiben. Dann zeichnen Sie es einfach. Dies kann wie folgt erfolgen, vorausgesetzt g ist ein pydot Graph:

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)

Dies ist besonders nützlich für gerichtete Grafiken, weil die matplotlib Fähigkeiten von networkx sind stark begrenzt Für solche Grafiken.

Siehe auch das Anfrage ziehen, was solche Funktionen direkt einführt networkx. Was bleibt, ist, dass jemand eine Schnittstelle zum Laden und Zeichnung des von erzeugten Layouts schreibt GraphViz als die für MATLAB im Dateiaustausch Graphviz -Schnittstelle, Matlab Graphviz Layoutimporteur, GraphViz4Matlab.

Hier ist eine einfache Lösung mit Ipython:

from IPython.display import Image, display

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

Beispiel Verwendung:

import networkx as nx
to_pdot = nx.drawing.nx_pydot.to_pydot
pdot = to_pdot(nx.complete_graph(5))
view_pydot(pdot)

Basierend auf diese Antwort (wie Bilder zeigen in python), hier ein paar Zeilen:

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

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

Image ist von der Python Imaging Library

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top