Cómo guardar una trama de Seaborn en un archivo

171

Intenté el siguiente 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()

Pero me sale este error:

  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 la final output.pngexista y se vea así:

ingrese la descripción de la imagen aquí

¿Cómo puedo resolver el problema?

Neversaint
fuente
1
La respuesta de @Terry Wang a continuación funcionó para mí - Python 2.7.12yseaborn 0.7.1
Cristian E. Nuno
1
Una frase 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

Respuestas:

130

Retire el get_figurey simplemente 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
fuente
38
Tenga en cuenta que esto no funciona en Seaborn 0.7.1 (ver otra respuesta).
Guido
31
Tenga en cuenta que esta respuesta, aunque aceptada, está desactualizada. La respuesta correcta es la dada por Salvatore aquí.
Gabriel
1
Error en 2020:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx
234

Las soluciones sugeridas son incompatibles con Seaborn 0.8.1

dando los siguientes errores porque la interfaz Seaborn ha cambiado:

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

Las siguientes llamadas le permiten acceder a la figura (compatible con Seaborn 0.8.1):

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

como se vio anteriormente en esta respuesta .

ACTUALIZACIÓN: Recientemente he usado el objeto PairGrid de seaborn para generar una trama similar a la de este ejemplo . En este caso, dado que GridPlot no es un objeto de trazado como, por ejemplo, sns.swarmplot, no tiene la función get_figure (). Es posible acceder directamente a la figura matplotlib mediante

fig = myGridPlotObject.fig

Como se sugirió anteriormente en otras publicaciones de este hilo.

Salvatore Cosentino
fuente
2
Recientemente he usado el objeto PairGrid de seaborn como en el ejemplo
Salvatore Cosentino
2
Esta es la única respuesta que también funciona para PairGrid y JointGrid, creo que debería aceptarse.
Ryszard Cetnarski el
41

Algunas de las soluciones anteriores no funcionaron para mí. El .figatributo no se encontró cuando lo intenté y no pude usarlo .savefig()directamente. Sin embargo, lo que funcionó fue:

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

Soy un nuevo usuario de Python, por lo que no sé si esto se debe a una actualización. Quería mencionarlo en caso de que alguien más se encuentre con los mismos problemas que yo.

D. Mercer
fuente
1
Esto funcionó para mí con un seaborn.swarmplot, pero para seaborn.lmploteso no funcionará. Con seaborn.lmplot, encontré sns_plot.savefig("output.png")trabajado como en la respuesta de Salvatore, pero sin necesidad de get_figure()llamar.
Wayne
14

Debería poder utilizar el savefigmétodo sns_plotdirectamente.

sns_plot.savefig("output.png")

Para mayor claridad con su código, si desea acceder a la figura matplotlib que sns_plotreside, puede obtenerlo directamente con

fig = sns_plot.fig

En este caso, no hay ningún get_figuremétodo como se supone en su código.

Simon Gibbons
fuente
9

Yo uso distploty get_figurepara guardar la imagen con éxito.

sns_hist = sns.distplot(df_train['SalePrice'])
fig = sns_hist.get_figure()
fig.savefig('hist.png')
Terry
fuente
Trabajado por mi entorno: la función sns.distplot()de python 3.5.6con seaborn 0.9.0. Además, la función sns.pairplot()no necesita la línea deget_figure()
Scott Yang
9

Menos líneas para los buscadores 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')

NOTA DE ACTUALIZACIÓN: sizese cambió a height.

Jade Cacho
fuente
3

Esto funciona para mi

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

También es posible crear un figureobjeto matplotlib y luego 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
fuente
1

sns.figure.savefig("output.png")Obtendría un error al usar seaborn sea 0.8.1.

En su lugar 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
fuente
-4

Solo para su información, el siguiente comando funcionó en seaborn 0.8.1, así que supongo que la respuesta inicial sigue siendo válida.

sns_plot = sns.pairplot(data, hue='species', size=3)
sns_plot.savefig("output.png")
Sudhi
fuente
Aunque ese código funciona, no está completo. El título dice: "Cómo guardar una trama de Seaborn en un archivo", que es más general. Desafortunadamente, la solución propuesta funciona con parcela, pero plantea una excepción con otros 'tipos' de parcelas. Con suerte, en futuras versiones habrá una forma más unificada de obtener el objeto 'figura' de una trama nacida en el mar.
Salvatore Cosentino