2015-06-08 10 views
6

Ich erzeuge Diagramme in Pandas/Matplotlib und möchte sie in eine XLSX-Datei schreiben. Ich möchte keine nativen Excel-Diagramme erstellen. Ich schreibe die Plots nur als nicht interaktive Bilder. Ich benutze die XlsxWriter library/engine. Die nächste Lösung, die ich gefunden habe, ist the answer to this SO question, was die Verwendung der XlsxWriter.write_image() Methode nahe legt. Diese Methode scheint jedoch einen Dateinamen als Eingabe zu verwenden. Ich versuche, die direkte Ausgabe von einem Aufruf pandas/matplotlib plot() programmgesteuert zu übergeben, z. so etwas wie diese:Pandas/matplotlib Bild direkt in XLSX Datei schreiben

h = results.resid.hist() 
worksheet.insert_image(row, 0, h) # doesn't work 

oder dies:

s = df.plot(kind="scatter", x="some_x_variable", y="resid") 
worksheet.insert_image(row, 0, s) # doesn't work 

Gibt es eine Möglichkeit, dies, kurz der Abhilfe zu erreichen, das Bild in eine Datei zuerst zu schreiben?

aktualisieren

Antwort hat mich unten auf dem richtigen Weg und zu akzeptieren werde. Ich musste ein paar Änderungen vornehmen, hauptsächlich (glaube ich), weil ich Python 3 und vielleicht einige API-Änderungen verwende. Hier ist die Lösung:

from io import BytesIO 
import matplotlib.pyplot as plt 

imgdata = BytesIO() 
fig, ax = plt.subplots() 
results.resid.hist(ax=ax) 
fig.savefig(imgdata, format="png") 
imgdata.seek(0) 

worksheet.insert_image(
    row, 0, "", 
    {'image_data': imgdata} 
) 

Die "" im insert_image() Code ist Excel zu verleiten, die noch einen Dateinamen/URL/etc erwartet.

+1

Zitat: * Die „“ in der insert_image() Code ist trick die API, die immer noch einen Dateinamen/URL/etc. erwartet. * Genau genommen erwartet Excel einen Dateinamen, und aus Gründen der Konsistenz wäre es am besten, einen zu liefern. – jmcnamara

+0

Warum verwenden Sie in diesem Fall aus Gründen der Neugier auch matplotlib und fügen dem Arbeitsblatt kein Diagramm direkt hinzu? – jmcnamara

+0

Danke, das repariere ich. Re 2. Kommentar, der Grund ist, dass ich nicht die Daten, die die Diagramme, nur einige verschiedene Daten und die Diagramme selbst exportieren würde: im Grunde Regression Ergebniszusammenfassung und eine ganze Reihe von Diagnosezeichnungen wie normale Histogramm von Resids, QQ, Scatters vs Resids, etc. Dies ist alles für Diagnosezwecke, nicht endgültige Geschäftsberichte. –

Antwort

8

Sie das Bild in dem Speicher als Dateiobjekt speichern kann (nicht auf der Festplatte) und dann verwenden, wenn sie in Excel-Datei einfügen:

import matplotlib.pyplot as plt 
from cStringIO import StringIO 
imgdata = StringIO() 

fig, ax = plt.subplots() 

# Make your plot here referencing ax created before 
results.resid.hist(ax=ax) 

fig.savefig(imgdata) 

worksheet.insert_image(row, 0, imgdata) 
Verwandte Themen