Як зберегти сюжет 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існуватиме і виглядатиме так:

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

Як я можу вирішити проблему?


1
@Terry Wang відповідь внизу працював для мене - Python 2.7.12іseaborn 0.7.1
Крістіан Е. Нуно

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

38
Зверніть увагу, що це не працює в Seaborn 0.7.1 (див. Іншу відповідь).
Гвідо

31
Зауважте, що ця відповідь хоча і прийнята застаріла. Правильна відповідь - та, яку тут дав Сальваторе.
Габріель

1
Помилка 2020 року:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx

236

Запропоновані рішення несумісні з 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 від морського народження, щоб генерувати сюжет, подібний до цього в цьому прикладі . У цьому випадку, оскільки GridPlot не є об'єктом сюжету, як, наприклад, sns.swarmplot, він не має функції get_figure (). Можна безпосередньо отримати доступ до фігури matplotlib за допомогою

fig = myGridPlotObject.fig

Як і раніше пропонувалося в інших публікаціях у цій темі.


2
Нещодавно я використовував об'єкт PairGrid від морського вродженого, як у прикладі
Salvatore Cosentino

2
Це єдина відповідь, яка працює і для PairGrid і JointGrid, я вважаю, що це слід прийняти.
Рішард Четнарський

41

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

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

Я новіший користувач Python, тому не знаю, чи це пов’язано з оновленням. Я хотів би згадати це у випадку, якщо хтось інший зіткнеться з тими ж проблемами, що і я.


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

3

Також можливо просто створити об'єкт matplotlib, figureа потім використовувати 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

Ви отримаєте помилку при використанні sns.figure.savefig("output.png")у новонароджених 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

Просто FYI, наведена нижче команда працювала у новонародженого 0.8.1, тому я гадаю, що початкова відповідь все ще справедлива.

sns_plot = sns.pairplot(data, hue='species', size=3)
sns_plot.savefig("output.png")

Хоча цей код працює, він не є повним. У заголовку сказано: "Як зберегти сюжет Seaborn у файл", що є більш загальним. На жаль, пропоноване рішення працює з парною версією, але це створює виняток з інших "видів" сюжетів. Будемо сподіватися, що в майбутніх випусках з'явиться більш уніфікований спосіб отримати об'єкт "фігури" з сюжету моря.
Сальваторе Косентіно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.