Speichern von Plots (AxesSubPlot), die aus Python-Pandas mit der savefig von matplotlib generiert wurden

78

Ich verwende Pandas, um aus einem Datenrahmen einen Plot zu generieren, den ich in einer Datei speichern möchte:

dtf = pd.DataFrame.from_records(d,columns=h)
fig = plt.figure()
ax = dtf2.plot()
ax = fig.add_subplot(ax)
fig.savefig('~/Documents/output.png')

Es scheint, als sollte die letzte Zeile mit matplotlibs savefig den Trick machen. Dieser Code erzeugt jedoch den folgenden Fehler:

Traceback (most recent call last):
  File "./testgraph.py", line 76, in <module>
    ax = fig.add_subplot(ax)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/figure.py", line 890, in add_subplot
    assert(a.get_figure() is self)
AssertionError

Alternativ kann der Versuch, savefig direkt im Plot aufzurufen, auch folgende Fehler verursachen:

dtf2.plot().savefig('~/Documents/output.png')


  File "./testgraph.py", line 79, in <module>
    dtf2.plot().savefig('~/Documents/output.png')
AttributeError: 'AxesSubplot' object has no attribute 'savefig'

Ich denke, ich muss irgendwie die von plot () zurückgegebene Nebenhandlung zu einer Figur hinzufügen, um savefig zu verwenden. Ich frage mich auch, ob dies vielleicht mit der Magie hinter der AxesSubPlot-Klasse zu tun hat .

BEARBEITEN:

Das Folgende funktioniert (ohne Fehler), hinterlässt aber ein leeres Seitenbild ....

fig = plt.figure()
dtf2.plot()
fig.savefig('output.png')

EDIT 2: Der folgende Code funktioniert auch gut

dtf2.plot().get_figure().savefig('output.png')
bhoward
quelle
11
oderax.figure.savefig(...)
Tacaswell
@tcaswell Ich stieß auf das gleiche Problem wie bhoward, und obwohl seine eigene Antwort für ihn funktionierte, funktionierte sie für mich nie. Es scheint, als ob der Aufruf der savefig()Methode direkt für das AxesSubplotObjekt (wie direkt darauf und nicht einmal für die ihm zugewiesene Variable) die einzige Möglichkeit ist, wie sie für mich funktionieren kann. Ich bin wirklich verwirrt, warum dies der Fall ist. Hast du irgendeine Idee? Ist es eine Art Fehler?
AKKO

Antworten:

119

Die gcf-Methode ist in V 0.14 entzogen. Der folgende Code funktioniert für mich:

plot = dtf.plot()
fig = plot.get_figure()
fig.savefig("output.png")
Wael Ben Zid El Guebsi
quelle
2
Ich habe versucht, Ihre Methode zu verwenden, aber es funktioniert nicht für michAttributeError Traceback (most recent call last) /home/kohaugustine/INTERNSHIPS/UIUC_ADSC/adsc-hardware/sochls/vast_work/llvm/tools/shang/util/sit/sit/data_analysis.py in <module>() 295 cycles_plot.set_ylabel('Simulation Cycle Count') 296 --> 297 cycles_plot_file = cycles_plot.getfigure() 298 cycles_plot_file.savefig('cycles.pdf') 299 #cycles_series.show() AttributeError: 'AxesSubplot' object has no attribute 'getfigure'
AKKO
Können Sie mir mehr Details über Ihre Umgebung geben?
Wael Ben Zid El Guebsi
Dies ergibt eine leere Zahl. Die andere Antwort funktioniert gut.
JohnnyM
Welche Version verwenden Sie? Wie in v0.14 erwähnt, funktioniert die .gcf () -Methode nicht
Wael Ben Zid El Guebsi
@AKKO du hast ein vergessen _- dh get_figurenicht getfigure!
ErichBSchulz
19

Ich bin mir also nicht ganz sicher, warum dies funktioniert, aber es speichert ein Bild mit meiner Handlung:

dtf = pd.DataFrame.from_records(d,columns=h)
dtf2.plot()
fig = plt.gcf()
fig.savefig('output.png')

Ich vermute, dass der letzte Ausschnitt aus meinem ursprünglichen Beitrag leer gespeichert wurde, weil die Figur nie die von Pandas erzeugten Achsen bekommen hat. Mit dem obigen Code wird das Figurenobjekt durch den Aufruf gcf () (aktuelle Figur abrufen) aus einem magischen globalen Zustand zurückgegeben, der automatisch in Achsen backt, die in der obigen Zeile dargestellt sind.

bhoward
quelle
Was ist "d" und was ist in diesem Fall "h"? Vielen Dank. @ Bhoward
Makansij
@ einfach sie sind von der ursprünglichen Frage
Danio
10

Es scheint mir einfach, plt.savefig()Funktion für plot()Funktion zu verwenden:

import matplotlib.pyplot as plt
dtf = pd.DataFrame.from_records(d,columns=h)
dtf.plot()
plt.savefig('~/Documents/output.png')
Ibelin
quelle
10

Sie können ax.figure.savefig()wie in einem Kommentar zur Frage vorgeschlagen Folgendes verwenden:

import pandas as pd

df = pd.DataFrame([0, 1])
ax = df.plot.line()
ax.figure.savefig('demo-file.pdf')

Dies hat keinen praktischen Vorteil gegenüber ax.get_figure().savefig()den in anderen Antworten vorgeschlagenen, sodass Sie die Option auswählen können, die Sie am ästhetischsten finden. In der Tat get_figure()einfach zurückself.figure :

# Source from snippet linked above
def get_figure(self):
    """Return the `.Figure` instance the artist belongs to."""
    return self.figure
joelostblom
quelle
funktioniert in pandas 0.25.3 und matplotlib 3.1.2, danke!
Irene
1
'ax.figure.savefig' ist die einzige Methode, die mit Pandas 0.25.3 und Matplotlib 2.2.3 funktioniert hat
Gench
3

Dies kann ein einfacherer Ansatz sein:

(DesiredFigure) .get_figure (). Savefig ('figure_name.png')

dh

dfcorr.hist(bins=50).get_figure().savefig('correlation_histogram.png')
Vamsi Chinta
quelle
Können Sie bitte anhand eines Beispiels weitere Erklärungen hinzufügen?
Nursnaaz
1
Dies funktioniert nicht, wenn Sie mehrere Figuren innerhalb derselben Funktion erstellen (funktioniert jedoch in Jupiter-Notizbuchzellen).
Jonathan