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.