2015-08-27 27 views
56

Ho provato il seguente codice (test_seaborn.py):Come salvare una trama Seaborn in un file

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 la finale output.png esisteranno e guardare in questo modo:

enter image description here

Come posso risolvere t lui problema?

risposta

47

Rimuovere il get_figure e basta usare 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") 
+9

Si prega di notare che questo non funziona in Seaborn 0.7.1 (vedi altra risposta). – Guido

+3

** Avviso ** che questa risposta, sebbene accettata, è obsoleta. La risposta corretta è [data da Salvatore qui.] (Http://stackoverflow.com/a/39482402/1391441) – Gabriel

10

Dovresti essere in grado di utilizzare direttamente il metodo savefig di sns_plot.

sns_plot.savefig("output.png") 

Per chiarezza con il codice se si voleva accedere alla figura matplotlib che sns_plot risiede in poi si può ottenere direttamente con

fig = sns_plot.fig 

In questo caso non c'è get_figure metodo il tuo codice assume.

53

Le soluzioni proposte sono incompatibili con Seaborn 0.7.1

dà i seguenti errori perché l'interfaccia è cambiata 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 

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

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

come visto in precedenza in this answer.

UPDATE: Recentemente ho usato oggetto PairGrid da Seaborn per generare una trama simile a quella in this example. In questo caso, poiché GridPlot non è un oggetto di trama come, ad esempio, sns.swarmplot, non ha la funzione get_figure(). È possibile accedere direttamente alla figura matplotlib da

fig = myGridPlotObject.fig 

Come precedentemente suggerito in altri messaggi della discussione.

+0

Ho riscontrato il problema come hai detto tu e questo metodo funziona – sikisis

+1

Ho recentemente usato l'oggetto PairGrid da seaborn come in l'esempio –

11

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

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

Sono un utente più recente di Python, quindi non so se questo è dovuto ad un aggiornamento. Volevo parlarne nel caso in cui qualcun altro si imbattesse negli stessi problemi che avevo io.

2

Io uso distplot e get_figure per salvare correttamente l'immagine.

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

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

utilizzare invece:

import seaborn as sns 

df = sns.load_dataset('iris') 
sns_plot = sns.pairplot(df, hue='species', size=2.5) 
sns_plot.savefig("output.png") 
Problemi correlati