Cómo guardar un gráfico de Seaborn en un archivo

4 minutos de lectura

avatar de usuario
nunca santo

Probé 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 la final output.png existirá y se verá así:

ingrese la descripción de la imagen aquí

¿Cómo puedo resolver el problema?

  • La respuesta de @Terry Wang a continuación funcionó para mí: Python 2.7.12 y seaborn 0.7.1

    – Cristian E. Nuno

    20 sep 2018 a las 19:04


  • Una sola línea para seaborn 0.9: sns.regplot(x='age', y='income', data=pd.read_csv('income_data.csv')).get_figure().savefig('income_f_age.png')

    – Antón Tarasenko

    18 de noviembre de 2018 a las 14:17

avatar de usuario
salvatore cosentino

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("out.png") 

como se vio anteriormente en esta respuesta.

Las soluciones sugeridas son incompatibles con Seaborn 0.8.1. Dan los siguientes errores porque la interfaz de 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

ACTUALIZAR:
he usado recientemente PairGrid objeto de seaborn para generar una trama similar a la de este ejemplo. En este caso, desde GridPlot no es un objeto de trama como, por ejemplo, sns.swarmplotNo tiene get_figure() función. Es posible acceder directamente a la figura de matplotlib mediante:

fig = myGridPlotObject.fig

  • Recientemente he usado el objeto PairGrid de seaborn como en el ejemplo

    – Salvatore Cosentino

    21 de diciembre de 2016 a las 7:10

  • Esta es la única respuesta que también funciona para PairGrid y JointGrid, creo que debería aceptarse.

    – Ryszard Cetnarski

    21 de septiembre de 2018 a las 12:44


  • El requisito de get_figure para guardar la figura es muy molesto. Debería ser posible usar en línea para guardar un gráfico en un archivo.

    – Mini nevera

    10 de agosto de 2020 a las 11:32

Algunas de las soluciones anteriores no me funcionaron. los .fig atributo no se encontró cuando probé eso y no pude usar .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 tenga los mismos problemas que yo.

  • Esto funcionó para mí con un seaborn.swarmplotpero para seaborn.lmplot eso no funcionará Con seaborn.lmplotEncontré sns_plot.savefig("output.png") funcionó como en la respuesta de Salvatore, pero sin necesidad de get_figure() llamar.

    – Wayne

    12 de abril de 2018 a las 13:49

  • Esto funcionó para displot con nacido en el mar 0.11.2. La única respuesta que pude llegar a trabajar!

    – Cornelio Roemer

    23 de noviembre de 2021 a las 21:25


avatar de usuario
Jade Cacho

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: size fue cambiado a height.

  • ¡produce una imagen blanca!

    – Secuaces

    28 de diciembre de 2020 a las 10:42

  • @ user_007 no estoy seguro de por qué obtienes una imagen en blanco. Acabo de probar el código hoy y está bien tanto para Jupyter Notebook como para el archivo de salida. Es posible que desee actualizar su consola/Python y verificar la configuración de Vista de su computadora.

    – Jade Cacho

    20 de julio de 2021 a las 15:17

avatar de usuario
Simón Gibbons

Solo deberías poder usar el savefig método de sns_plot directamente.

sns_plot.savefig("output.png")

Para mayor claridad con su código, si desea acceder a la figura de matplotlib que sns_plot reside en entonces puede obtenerlo directamente con

fig = sns_plot.fig

En este caso no hay get_figure método como asume su código.

yo suelo distplot y get_figure para guardar la imagen con éxito.

sns_hist = sns.distplot(df_train['SalePrice'])
fig = sns_hist.get_figure()
fig.savefig('hist.png')

  • Trabajó para mi entorno: función sns.distplot() en python 3.5.6 con seaborn 0.9.0 . Además, función sns.pairplot() no necesita la línea de get_figure()

    –Scott Yang

    1 de abril de 2019 a las 7:04

No pude hacer que las otras respuestas funcionaran y finalmente conseguí que esto funcionara para mí para matplotlib==3.2.1. Es especialmente cierto si está haciendo esto dentro de un bucle for o algún enfoque iterativo.

sns.scatterplot(
    data=df_hourly, x="date_week", y="value",hue="variable"
)
plt.savefig('./f1.png')
plt.show()

Tenga en cuenta que savefig debe estar antes de la llamada show. De lo contrario, se guarda una imagen vacía.

  • Trabajó para mi entorno: función sns.distplot() en python 3.5.6 con seaborn 0.9.0 . Además, función sns.pairplot() no necesita la línea de get_figure()

    –Scott Yang

    1 de abril de 2019 a las 7:04

avatar de usuario
4b0

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad