Как сохранить сюжет Seaborn в файл

172

Я попробовал следующий код ( 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()

Но я получаю эту ошибку:

  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'

Я ожидаю, что финал output.pngбудет существовать и выглядеть так:

введите описание изображения здесь

Как я могу решить проблему?

neversaint
источник
1
Ответ @Terry Ван вниз работал для меня - Python 2.7.12иseaborn 0.7.1
Cristian E. нуно
1
Однострочник для seaborn 0.9:sns.regplot(x='age', y='income', data=pd.read_csv('income_data.csv')).get_figure().savefig('income_f_age.png')
Антона Тарасенко

Ответы:

130

Вынуть get_figureи просто использоватьsns_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
источник
38
Обратите внимание, что это не работает в Seaborn 0.7.1 (см. Другой ответ).
Гвидо
31
Обратите внимание, что этот ответ, хотя и принят, устарел. Правильный ответ - тот, что дан Сальваторе здесь.
Габриэль
1
Ошибка в 2020 году:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx
237

Предлагаемые решения несовместимы с Seaborn 0.8.1.

выдавая следующие ошибки, потому что интерфейс 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

Следующие вызовы позволяют получить доступ к рисунку (совместим с Seaborn 0.8.1):

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

как видно ранее в этом ответе .

ОБНОВЛЕНИЕ: я недавно использовал объект PairGrid из seaborn для создания графика, похожего на тот, что в этом примере . В этом случае, поскольку GridPlot не является объектом графика, как, например, sns.swarmplot, у него нет функции get_figure (). Прямой доступ к фигуре matplotlib можно получить

fig = myGridPlotObject.fig

Как ранее предлагалось в других сообщениях в этой теме.

Сальваторе Косентино
источник
2
Я недавно использовал объект PairGrid из seaborn, как в примере
Сальваторе Косентино
2
Это единственный ответ, который работает и для PairGrid, и для JointGrid, думаю, его следует принять.
Рышард Цетнарски
41

Некоторые из вышеперечисленных решений не работают для меня. .figАтрибут не был найден , когда я пытался , что и я не мог использовать .savefig()напрямую. Однако, что сработало:

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

Я новичок в Python, поэтому не знаю, связано ли это с обновлением. Я хотел упомянуть об этом на тот случай, если кто-нибудь столкнется с теми же проблемами, что и я.

D.Mercer
источник
1
Это сработало для меня с seaborn.swarmplot, но для seaborn.lmplotэтого не сработает. С seaborn.lmplot, я нашел sns_plot.savefig("output.png")работает, как в ответе Сальваторе, но без необходимости get_figure()вызова.
Уэйн
14

Вы должны просто быть в состоянии использовать savefigметод sns_plotнапрямую.

sns_plot.savefig("output.png")

Для ясности с вашим кодом, если вы хотите получить доступ к фигуре matplotlib, которая sns_plotнаходится в ней, вы можете получить ее напрямую с помощью

fig = sns_plot.fig

В этом случае нет get_figureметода, как предполагает ваш код.

Саймон Гиббонс
источник
9

Я использую distplotи, get_figureчтобы сохранить изображение успешно.

sns_hist = sns.distplot(df_train['SalePrice'])
fig = sns_hist.get_figure()
fig.savefig('hist.png')
Терри
источник
Работал для моей среды: функция sns.distplot()в python 3.5.6с seaborn 0.9.0. Кроме того, функция sns.pairplot()не нуждается в строкеget_figure()
Скотт Ян
9

Меньше строк для поисковиков 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')

ПРИМЕЧАНИЕ ОБНОВЛЕНИЯ: sizeбыло изменено на height.

Джейд Качо
источник
3

Это работает для меня

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
источник
3

Также возможно просто создать figureобъект matplotlib и затем использовать 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
источник
1

Вы получите ошибку при использовании sns.figure.savefig("output.png")в seaborn 0.8.1.

Вместо этого используйте:

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

Просто к вашему сведению, приведенная ниже команда работала в seaborn 0.8.1, поэтому я думаю, что первоначальный ответ все еще действителен.

sns_plot = sns.pairplot(data, hue='species', size=3)
sns_plot.savefig("output.png")
Sudhi
источник
Хотя этот код работает, он не завершен. Название гласит: «Как сохранить сюжет Seaborn в файл», что является более общим. К сожалению, предлагаемое решение работает с парным графиком, но оно вызывает исключение для других «видов» графиков. Надеемся, что в будущих выпусках появится более унифицированный способ получения объекта «фигура» с участка морского побережья.
Сальваторе Косентино