Cara menyimpan plot Seaborn ke dalam file

171

Saya mencoba kode berikut ( 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()

Tapi saya mendapatkan kesalahan ini:

  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'

Saya berharap final output.pngakan ada dan terlihat seperti ini:

masukkan deskripsi gambar di sini

Bagaimana saya bisa menyelesaikan masalah?

neversaint
sumber
1
@Terry Wang jawaban di bawah bekerja untuk saya - Python 2.7.12danseaborn 0.7.1
Cristian E. Nuno
1
Satu kalimat untuk 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

Jawaban:

130

Hapus get_figuredan gunakan sajasns_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
sumber
38
Harap dicatat bahwa ini tidak berfungsi di Seaborn 0.7.1 (lihat jawaban lain).
Guido
31
Perhatikan bahwa jawaban ini meskipun diterima sudah usang. Jawaban yang benar adalah yang diberikan oleh Salvatore di sini.
Gabriel
1
Kesalahan pada tahun 2020:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx
234

Solusi yang disarankan tidak kompatibel dengan Seaborn 0.8.1

memberikan kesalahan berikut karena antarmuka Seaborn telah berubah:

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

Panggilan berikut memungkinkan Anda untuk mengakses gambar (kompatibel Seaborn 0.8.1):

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

seperti yang terlihat sebelumnya dalam jawaban ini .

UPDATE: Saya baru-baru ini menggunakan objek PairGrid dari seaborn untuk menghasilkan plot yang mirip dengan yang ada dalam contoh ini . Dalam hal ini, karena GridPlot bukan objek plot seperti, misalnya, sns.swarmplot, ia tidak memiliki fungsi get_figure (). Dimungkinkan untuk secara langsung mengakses gambar matplotlib oleh

fig = myGridPlotObject.fig

Seperti yang disarankan sebelumnya di posting lain di utas ini.

Salvatore Cosentino
sumber
2
Saya baru-baru ini menggunakan objek PairGrid dari seaborn seperti dalam contoh
Salvatore Cosentino
2
Ini adalah satu-satunya jawaban yang berfungsi untuk PairGrid dan JointGrid juga, saya pikir itu harus diterima.
Ryszard Cetnarski
41

Beberapa solusi di atas tidak berhasil untuk saya. The .figatribut tidak ditemukan ketika saya mencoba itu dan saya tidak mampu untuk menggunakan .savefig()secara langsung. Namun, yang berhasil adalah:

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

Saya adalah pengguna Python yang lebih baru, jadi saya tidak tahu apakah ini karena pembaruan. Saya ingin menyebutkannya kalau-kalau ada orang lain yang mengalami masalah yang sama seperti saya.

D.Mercer
sumber
1
Ini bekerja untuk saya dengan seaborn.swarmplot, tetapi untuk seaborn.lmplotitu tidak akan berhasil. Dengan seaborn.lmplot, saya menemukan sns_plot.savefig("output.png")bekerja seperti dalam jawaban Salvatore, tetapi tanpa perlu get_figure()panggilan.
Wayne
14

Anda seharusnya hanya dapat menggunakan savefigmetode sns_plotlangsung.

sns_plot.savefig("output.png")

Untuk kejelasan dengan kode Anda jika Anda ingin mengakses gambar matplotlib yang sns_plotberada di maka Anda bisa mendapatkannya langsung dengan

fig = sns_plot.fig

Dalam hal ini tidak ada get_figuremetode karena kode Anda mengasumsikan.

Simon Gibbons
sumber
9

Saya menggunakan distplotdan get_figureuntuk menyimpan gambar dengan sukses.

sns_hist = sns.distplot(df_train['SalePrice'])
fig = sns_hist.get_figure()
fig.savefig('hist.png')
Terry
sumber
Bekerja untuk lingkungan saya: fungsi sns.distplot()di python 3.5.6dengan seaborn 0.9.0. Selain itu, fungsi sns.pairplot()tidak perlu barisget_figure()
Scott Yang
9

Lebih sedikit baris untuk 2019 pencari:

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

CATATAN PEMBARUAN: sizetelah diubah menjadi height.

Jade Cacho
sumber
3

Ini bekerja untuk saya

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
sumber
3

Mungkin juga untuk hanya membuat figureobjek matplotlib dan kemudian menggunakan 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
sumber
1

Anda akan mendapatkan kesalahan untuk menggunakan sns.figure.savefig("output.png")seaborn 0.8.1.

Alih-alih gunakan:

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
sumber
-4

Hanya FYI, perintah di bawah ini bekerja di seaborn 0.8.1 jadi saya kira jawaban awal masih valid.

sns_plot = sns.pairplot(data, hue='species', size=3)
sns_plot.savefig("output.png")
Sudhi
sumber
Meskipun kode itu berfungsi, itu tidak lengkap. Judulnya berbunyi, 'Bagaimana cara menyimpan plot Seaborn ke dalam file' yang lebih umum. Sayangnya solusi yang diusulkan bekerja dengan pairplot, tetapi menimbulkan pengecualian dengan 'jenis' plot lainnya. Semoga dalam rilis mendatang akan ada cara yang lebih terpadu untuk mendapatkan objek 'gambar' dari plot seaborn.
Salvatore Cosentino