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?


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")

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.


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.


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.


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')

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.


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')

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

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")

-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")

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.