Jak zapisać wykres Seaborn do pliku

171

Wypróbowałem następujący kod ( test_seaborn.py):

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

Ale pojawia się ten błąd:

  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'

Spodziewam się, że finał output.pngbędzie istniał i będzie wyglądał tak:

wprowadź opis obrazu tutaj

Jak mogę rozwiązać problem?

neversaint
źródło
1
Odpowiedź @Terry'ego Wanga poniżej zadziałała dla mnie - Python 2.7.12iseaborn 0.7.1
Cristian E. Nuno
1
Jedna linijka dla 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

Odpowiedzi:

129

Usuń get_figurei po prostu użyjsns_plot.savefig('output.png')

df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
sns_plot.savefig("output.png")
Overclover
źródło
38
Należy pamiętać, że to nie działa w Seaborn 0.7.1 (zobacz inną odpowiedź).
Guido
31
Zauważ, że ta odpowiedź, chociaż zaakceptowana, jest nieaktualna. Prawidłowa odpowiedź to ta, której udzielił tutaj Salvatore.
Gabriel
1
Błąd w 2020 roku:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx
234

Sugerowane rozwiązania są niekompatybilne z Seaborn 0.8.1

podając następujące błędy, ponieważ zmienił się interfejs Seaborn:

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

Poniższe wywołania umożliwiają dostęp do rysunku (kompatybilny z Seaborn 0.8.1):

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

jak widać wcześniej w tej odpowiedzi .

UPDATE: Niedawno użyłem obiektu PairGrid z seaborn do wygenerowania wykresu podobnego do tego w tym przykładzie . W tym przypadku, ponieważ GridPlot nie jest obiektem wykresu, jak na przykład sns.swarmplot, nie ma funkcji get_figure (). Istnieje możliwość bezpośredniego dostępu do rysunku matplotlib przez

fig = myGridPlotObject.fig

Jak sugerowano wcześniej w innych postach w tym wątku.

Salvatore Cosentino
źródło
2
Niedawno użyłem obiektu PairGrid z poroża morskiego, jak na przykładzie
Salvatore Cosentino
2
To jedyna odpowiedź, która działa również dla PairGrid i JointGrid, myślę, że powinna zostać zaakceptowana.
Ryszard Cetnarski
41

Niektóre z powyższych rozwiązań u mnie nie działały. .figAtrybut nie został znaleziony, gdy próbowałem tego i nie byłem w stanie używać .savefig()bezpośrednio. Jednak zadziałało:

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

Jestem nowszym użytkownikiem Pythona, więc nie wiem, czy jest to spowodowane aktualizacją. Chciałem o tym wspomnieć na wypadek, gdyby ktoś inny napotkał te same problemy co ja.

D.Mercer
źródło
1
To zadziałało dla mnie z seaborn.swarmplot, ale seaborn.lmplotto nie zadziała. Z seaborn.lmplot, stwierdziłem, że sns_plot.savefig("output.png")działa jak w odpowiedzi Salvatore, ale bez potrzeby get_figure()dzwonienia.
Wayne,
14

Powinieneś po prostu móc użyć savefigmetody sns_plotbezpośrednio.

sns_plot.savefig("output.png")

Dla jasności kodu, jeśli chcesz uzyskać dostęp do rysunku matplotlib, który się sns_plotznajduje, możesz go pobrać bezpośrednio za pomocą

fig = sns_plot.fig

W takim przypadku nie ma get_figuremetody, jak zakłada Twój kod.

Simon Gibbons
źródło
9

Używam distploti, get_figureaby pomyślnie zapisać obrazek.

sns_hist = sns.distplot(df_train['SalePrice'])
fig = sns_hist.get_figure()
fig.savefig('hist.png')
Terry
źródło
Pracował dla mojego środowiska: funkcję sns.distplot()w python 3.5.6z seaborn 0.9.0. Poza tym funkcja sns.pairplot()nie potrzebuje liniiget_figure()
Scott Yang
9

Mniej wierszy dla wyszukiwarek 2019:

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 NOTE: sizezostała zmieniona na height.

Jade Cacho
źródło
3

To działa dla mnie

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
źródło
3

Można również po prostu utworzyć figureobiekt matplotlib, a następnie użyć 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
źródło
1

sns.figure.savefig("output.png")Wystąpiłby błąd podczas używania w wersji 0.8.1 Seaaborn.

Zamiast tego użyj:

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
źródło
-4

Do Twojej wiadomości, poniższe polecenie działało w wersji 0.8.1 na seaborn, więc myślę, że początkowa odpowiedź jest nadal aktualna.

sns_plot = sns.pairplot(data, hue='species', size=3)
sns_plot.savefig("output.png")
Sudhi
źródło
Chociaż ten kod działa, nie jest kompletny. Tytuł mówi: „Jak zapisać działkę Seaborn do pliku”, co jest bardziej ogólne. Proponowane rozwiązanie niestety działa z parkietem, ale stanowi wyjątek w przypadku innych „rodzajów” działek. Miejmy nadzieję, że w przyszłych wydaniach będzie bardziej ujednolicony sposób uzyskiwania „figurki” z działki morskiej.
Salvatore Cosentino