Come salvare un diagramma di Seaborn in un file


171

Ho provato il seguente codice ( 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()

Ma ottengo questo errore:

  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'

Mi aspetto che il finale output.pngesista e assomigli a questo:

inserisci qui la descrizione dell'immagine

Come posso risolvere il problema?


1
La risposta di @Terry Wang in basso ha funzionato per me - Python 2.7.12eseaborn 0.7.1
— Cristian E. Nuno il

1
Un one-liner per 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,

Risposte:


130

Rimuovere il get_figuree basta usaresns_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
Si noti che ciò non funziona in Seaborn 0.7.1 (vedere altra risposta).
— Guido,

31
Si noti che questa risposta, sebbene accettata, è obsoleta. La risposta corretta è quella data da Salvatore qui.
— Gabriel,

1
Errore nel 2020:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
— Nyxynyx il

234

Le soluzioni suggerite sono incompatibili con Seaborn 0.8.1

dando i seguenti errori perché l'interfaccia Seaborn è cambiata:

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

Le seguenti chiamate consentono di accedere alla figura (compatibile con Seaborn 0.8.1):

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

come visto in precedenza in questa risposta .

AGGIORNAMENTO: Di recente ho usato l'oggetto PairGrid di Seaborn per generare un diagramma simile a quello in questo esempio . In questo caso, poiché GridPlot non è un oggetto trama come, ad esempio, sns.swarmplot, non ha alcuna funzione get_figure (). È possibile accedere direttamente alla figura matplotlib tramite

fig = myGridPlotObject.fig

Come precedentemente suggerito in altri post di questa discussione.


2
Recentemente ho usato l'oggetto PairGrid di Seaborn come nell'esempio
— Salvatore Cosentino,

2
Questa è l'unica risposta che funziona anche per PairGrid e JointGrid, penso che dovrebbe essere accettata.
— Ryszard Cetnarski,

41

Alcune delle soluzioni di cui sopra non hanno funzionato per me. L' .figattributo non è stato trovato quando l'ho provato e non sono stato in grado di utilizzare .savefig()direttamente. Tuttavia, ciò che ha funzionato è stato:

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

Sono un nuovo utente di Python, quindi non so se ciò sia dovuto a un aggiornamento. Volevo menzionarlo nel caso in cui qualcun altro incontri gli stessi problemi che ho fatto io.


1
Questo ha funzionato per me con un seaborn.swarmplot, ma per seaborn.lmplotquello non funzionerà. Con seaborn.lmplot, ho trovato sns_plot.savefig("output.png")funzionato come nella risposta di Salvatore, ma senza bisogno di get_figure()chiamare.
— Wayne,

14

Dovresti essere in grado di usare il savefigsns_plot direttamente metodo di .

sns_plot.savefig("output.png")

Per chiarezza con il codice se si desidera accedere alla figura matplotlib che sns_plotrisiede in, è possibile ottenerlo direttamente con

fig = sns_plot.fig

In questo caso non esiste un get_figuremetodo come presuppone il codice.


9

Io uso distplote get_figureper salvare l'immagine con successo.

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

Ha lavorato per il mio ambiente: la funzione sns.distplot()in python 3.5.6con seaborn 0.9.0. Inoltre, la funzione sns.pairplot()non ha bisogno della linea diget_figure()
— Scott Yang

9

Meno linee per i ricercatori del 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 AGGIORNAMENTO: è sizestato modificato in height.


3

Questo funziona per me

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

È anche possibile creare un figureoggetto matplotlib e quindi utilizzare 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

Si otterrebbe un errore per l'utilizzo sns.figure.savefig("output.png")in Seaborn 0.8.1.

Invece usa:

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

Cordiali saluti, il comando seguente ha funzionato in Seaborn 0.8.1, quindi immagino che la risposta iniziale sia ancora valida.

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

Sebbene quel codice funzioni, non è completo. Il titolo dice "Come salvare un diagramma di Seaborn in un file" che è più generale. Sfortunatamente la soluzione proposta funziona con un diagramma a coppie, ma solleva un'eccezione con altri "tipi" di grafici. Speriamo che nelle versioni future ci sia un modo più unificato per ottenere l'oggetto "figura" da un complotto marino.
— Salvatore Cosentino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.