So speichern Sie ein Seaborn-Diagramm in einer Datei

171

Ich habe den folgenden Code ( test_seaborn.py) ausprobiert :

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
import seaborn as sns
sns.set()
df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
fig = sns_plot.get_figure()
fig.savefig("output.png")
#sns.plt.show()

Aber ich bekomme diesen Fehler:

  Traceback (most recent call last):
  File "test_searborn.py", line 11, in <module>
    fig = sns_plot.get_figure()
AttributeError: 'PairGrid' object has no attribute 'get_figure'

Ich gehe davon aus, dass das Finale output.pngexistieren wird und so aussehen wird:

Geben Sie hier die Bildbeschreibung ein

Wie kann ich das Problem lösen?

neversaint
quelle
1
@ Terry Wangs Antwort unten funktionierte für mich - Python 2.7.12undseaborn 0.7.1
Cristian E. Nuno
1
Ein Einzeiler für seaborn 0.9:sns.regplot(x='age', y='income', data=pd.read_csv('income_data.csv')).get_figure().savefig('income_f_age.png')
Anton Tarasenko

Antworten:

129

Entfernen Sie die get_figureund verwenden Sie einfachsns_plot.savefig('output.png')

df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
sns_plot.savefig("output.png")
Überklee
quelle
37
Bitte beachten Sie, dass dies in Seaborn 0.7.1 nicht funktioniert (siehe andere Antwort).
Guido
30
Beachten Sie, dass diese Antwort, obwohl sie akzeptiert wird, veraltet ist. Die richtige Antwort ist die von Salvatore hier gegebene.
Gabriel
1
Fehler im Jahr 2020:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx
232

Die vorgeschlagenen Lösungen sind nicht mit Seaborn 0.8.1 kompatibel

Geben Sie die folgenden Fehler an, da sich die Seaborn-Schnittstelle geändert hat:

AttributeError: 'AxesSubplot' object has no attribute 'fig'
When trying to access the figure

AttributeError: 'AxesSubplot' object has no attribute 'savefig'
when trying to use the savefig directly as a function

Mit den folgenden Aufrufen können Sie auf die Abbildung zugreifen (Seaborn 0.8.1-kompatibel):

swarm_plot = sns.swarmplot(...)
fig = swarm_plot.get_figure()
fig.savefig(...) 

wie zuvor in dieser Antwort gesehen .

UPDATE: Ich habe kürzlich das PairGrid-Objekt von seaborn verwendet, um ein Diagramm zu erstellen, das dem in diesem Beispiel ähnelt . In diesem Fall hat GridPlot keine Funktion get_figure (), da es sich nicht um ein Plotobjekt wie z. B. sns.swarmplot handelt. Es ist möglich, direkt auf die Matplotlib-Figur zuzugreifen

fig = myGridPlotObject.fig

Wie bereits in anderen Beiträgen in diesem Thread vorgeschlagen.

Salvatore Cosentino
quelle
2
Ich habe vor kurzem PairGrid-Objekt von seaborn wie im Beispiel verwendet
Salvatore Cosentino
2
Dies ist die einzige Antwort, die auch für PairGrid und JointGrid funktioniert. Ich denke, sie sollte akzeptiert werden.
Ryszard Cetnarski
41

Einige der oben genannten Lösungen haben bei mir nicht funktioniert. Das .figAttribut wurde nicht gefunden, als ich das versuchte, und ich konnte es nicht .savefig()direkt verwenden. Was jedoch funktionierte, war:

sns_plot.figure.savefig("output.png")

Ich bin ein neuerer Python-Benutzer, daher weiß ich nicht, ob dies auf ein Update zurückzuführen ist. Ich wollte es erwähnen, falls jemand anderes auf die gleichen Probleme stößt wie ich.

D. Mercer
quelle
1
Das hat bei mir mit einem geklappt seaborn.swarmplot, aber seaborn.lmplotdas klappt nicht. Mit seaborn.lmplotfand ich sns_plot.savefig("output.png")funktioniert wie in Salvatores Antwort, aber ohne get_figure()Anruf.
Wayne
14

Sie sollten nur in der Lage sein, die savefigMethode von sns_plotdirekt zu verwenden.

sns_plot.savefig("output.png")

Wenn Sie zur Verdeutlichung Ihres Codes auf die Matplotlib-Figur zugreifen möchten, sns_plotin der Sie sich befinden, können Sie sie direkt mit abrufen

fig = sns_plot.fig

In diesem Fall gibt es keine get_figureMethode, wie Ihr Code annimmt.

Simon Gibbons
quelle
9

Ich benutze distplotund get_figureum Bilder erfolgreich zu speichern.

sns_hist = sns.distplot(df_train['SalePrice'])
fig = sns_hist.get_figure()
fig.savefig('hist.png')
Terry
quelle
Arbeitete für meine Umgebung: Funktion sns.distplot()in python 3.5.6mit seaborn 0.9.0. Außerdem sns.pairplot()braucht die Funktion nicht die Zeile vonget_figure()
Scott Yang
9

Weniger Zeilen für 2019-Suchende:

import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', height=2.5)
plt.savefig('output.png')

UPDATE HINWEIS: sizewurde in geändert height.

Jade Cacho
quelle
3

Das funktioniert bei mir

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

sns.factorplot(x='holiday',data=data,kind='count',size=5,aspect=1)
plt.savefig('holiday-vs-count.png')
Niraj D Pandey
quelle
3

Es ist auch möglich, einfach ein matplotlib- figureObjekt zu erstellen und dann Folgendes zu verwenden plt.savefig(...):

from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd

df = sns.load_dataset('iris')
plt.figure() # Push new figure on stack
sns_plot = sns.pairplot(df, hue='species', size=2.5)
plt.savefig('output.png') # Save that figure
tttthomasssss
quelle
1

Sie würden einen Fehler bei der Verwendung sns.figure.savefig("output.png")in seaborn 0.8.1 erhalten.

Verwenden Sie stattdessen:

import seaborn as sns

df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
sns_plot.savefig("output.png")
marići
quelle
-4

Nur zu Ihrer Information, der folgende Befehl hat in seaborn 0.8.1 funktioniert, also denke ich, dass die erste Antwort immer noch gültig ist.

sns_plot = sns.pairplot(data, hue='species', size=3)
sns_plot.savefig("output.png")
Sudhi
quelle
Obwohl dieser Code funktioniert, ist er nicht vollständig. Der Titel lautet "So speichern Sie ein Seaborn-Grundstück in einer Datei", was allgemeiner ist. Leider funktioniert die vorgeschlagene Lösung mit Pairplot, löst jedoch eine Ausnahme bei anderen Arten von Plots aus. Hoffentlich wird es in zukünftigen Versionen einen einheitlicheren Weg geben, um das 'Figuren'-Objekt von einem seegeborenen Grundstück zu erhalten.
Salvatore Cosentino