Como salvar uma plotagem Seaborn em um arquivo

171

Eu tentei o seguinte código ( 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()

Mas eu recebo este erro:

  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'

Espero que a final output.pngexista e fique assim:

insira a descrição da imagem aqui

Como posso resolver o problema?

neversaint
fonte
1
A resposta de @Terry Wang abaixo funcionou para mim - Python 2.7.12eseaborn 0.7.1
Cristian E. Nuno
1
Uma linha para 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

Respostas:

130

Remova o get_figuree apenas usesns_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
fonte
38
Observe que isso não funciona no Seaborn 0.7.1 (consulte outra resposta).
Guido
31
Observe que essa resposta, embora aceita, está desatualizada. A resposta correta é a dada por Salvatore aqui.
Gabriel
1
Erro em 2020:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx 04/06
234

As soluções sugeridas são incompatíveis com Seaborn 0.8.1

dando os seguintes erros porque a interface Seaborn mudou:

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

As chamadas a seguir permitem acessar a figura (compatível com Seaborn 0.8.1):

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

como visto anteriormente em nesta resposta .

UPDATE: Recentemente, usei o objeto PairGrid de seaborn para gerar um gráfico semelhante ao deste exemplo . Nesse caso, como o GridPlot não é um objeto de plotagem como, por exemplo, sns.swarmplot, ele não possui a função get_figure (). É possível acessar diretamente a figura do matplotlib

fig = myGridPlotObject.fig

Como sugerido anteriormente em outros posts deste tópico.

Salvatore Cosentino
fonte
2
I utilizaram recentemente objecto de PairGrid nascido do mar como no exemplo
Salvatore Cosentino
2
Esta é a única resposta que funciona para PairGrid e JointGrid também, acho que deve ser aceito.
Ryszard Cetnarski 21/09
41

Algumas das soluções acima não funcionaram para mim. O .figatributo não foi encontrado quando tentei e não consegui usá-lo .savefig()diretamente. No entanto, o que funcionou foi:

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

Eu sou um usuário Python mais novo, então não sei se isso se deve a uma atualização. Eu queria mencionar isso no caso de alguém encontrar os mesmos problemas que eu.

D.Mercer
fonte
1
Isso funcionou para mim com um seaborn.swarmplot, mas para seaborn.lmplotisso não vai funcionar. Com seaborn.lmplot, descobri que sns_plot.savefig("output.png")funcionava como na resposta de Salvatore, mas sem necessidade de get_figure()ligação.
Wayne
14

Você deve conseguir usar o savefigmétodo sns_plotdiretamente.

sns_plot.savefig("output.png")

Para maior clareza do seu código, se você deseja acessar a figura matplotlib que sns_plotreside, é possível obtê-la diretamente com

fig = sns_plot.fig

Nesse caso, não há get_figuremétodo como o seu código assume.

Simon Gibbons
fonte
9

Eu uso distplote get_figurepara salvar a foto com sucesso.

sns_hist = sns.distplot(df_train['SalePrice'])
fig = sns_hist.get_figure()
fig.savefig('hist.png')
Terry
fonte
Trabalhou para o meu ambiente: função sns.distplot()em python 3.5.6com seaborn 0.9.0. Além disso, a função sns.pairplot()não precisa da linha deget_figure()
Scott Yang
9

Menos linhas para os pesquisadores de 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')

ATUALIZAÇÃO NOTA: sizefoi alterada para height.

Jade Cacho
fonte
3

Isso funciona para mim

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

Também é possível apenas criar um figureobjeto matplotlib e depois usar 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
fonte
1

Você receberia um erro ao usar sns.figure.savefig("output.png")no seaborn 0.8.1.

Em vez disso, use:

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

Apenas para sua informação, o comando abaixo funcionou no seaborn 0.8.1, então acho que a resposta inicial ainda é válida.

sns_plot = sns.pairplot(data, hue='species', size=3)
sns_plot.savefig("output.png")
Sudhi
fonte
Embora esse código esteja funcionando, ele não está completo. O título diz: 'Como salvar um lote do Seaborn em um arquivo', que é mais geral. Infelizmente, a solução proposta trabalha com parplot, mas gera uma exceção com outros 'tipos' de plotagens. Felizmente, em versões futuras, haverá uma maneira mais unificada de obter o objeto 'figura' de uma trama no mar.
Salvatore Cosentino