Comment enregistrer un tracé Seaborn dans un fichier


172

J'ai essayé le code suivant ( 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()

Mais j'obtiens cette erreur:

  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'

J'espère que la finale output.pngexistera et ressemblera à ceci:

entrez la description de l'image ici

Comment puis-je résoudre le problème?


1
La réponse de @Terry Wang ci-dessous a fonctionné pour moi - Python 2.7.12etseaborn 0.7.1
Cristian E. Nuno

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

Réponses:


130

Retirez le get_figureet utilisez simplementsns_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
Veuillez noter que cela ne fonctionne pas dans Seaborn 0.7.1 (voir autre réponse).
Guido

31
Notez que cette réponse, bien qu'acceptée, est obsolète. La bonne réponse est celle donnée par Salvatore ici.
Gabriel

1
Erreur en 2020:AttributeError: 'AxesSubplot' object has no attribute 'savefig'
Nyxynyx le

237

Les solutions proposées sont incompatibles avec Seaborn 0.8.1

donnant les erreurs suivantes car l'interface Seaborn a changé:

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

Les appels suivants vous permettent d'accéder à la figure (compatible Seaborn 0.8.1):

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

comme vu précédemment dans cette réponse .

MISE À JOUR: J'ai récemment utilisé l'objet PairGrid de seaborn pour générer un tracé similaire à celui de cet exemple . Dans ce cas, puisque GridPlot n'est pas un objet de tracé comme, par exemple, sns.swarmplot, il n'a pas de fonction get_figure (). Il est possible d'accéder directement à la figure matplotlib en

fig = myGridPlotObject.fig

Comme suggéré précédemment dans d'autres articles de ce fil.


2
J'ai récemment utilisé l'objet PairGrid de seaborn comme dans l'exemple
Salvatore Cosentino

2
C'est la seule réponse qui fonctionne également pour PairGrid et JointGrid, je pense qu'elle devrait être acceptée.
Ryszard Cetnarski

41

Certaines des solutions ci-dessus n'ont pas fonctionné pour moi. L' .figattribut n'a pas été trouvé lorsque j'ai essayé cela et je n'ai pas pu l'utiliser .savefig()directement. Cependant, ce qui a fonctionné était:

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

Je suis un nouvel utilisateur de Python, donc je ne sais pas si cela est dû à une mise à jour. Je voulais le mentionner au cas où quelqu'un d'autre rencontrerait les mêmes problèmes que moi.


1
Cela a fonctionné pour moi avec un seaborn.swarmplot, mais pour seaborn.lmplotcela ne fonctionnera pas. Avec seaborn.lmplot, j'ai trouvé sns_plot.savefig("output.png")travaillé comme dans la réponse de Salvatore, mais sans get_figure()appel.
Wayne

14

Vous devriez simplement pouvoir utiliser la savefigméthode de sns_plotdirectement.

sns_plot.savefig("output.png")

Pour plus de clarté avec votre code, si vous souhaitez accéder à la figure matplotlib qui sns_plotréside, vous pouvez l'obtenir directement avec

fig = sns_plot.fig

Dans ce cas, il n'y a pas de get_figureméthode comme le suppose votre code.


9

J'utilise distplotet get_figurepour enregistrer l'image avec succès.

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

A travaillé pour mon environnement: fonction sns.distplot()en python 3.5.6avec seaborn 0.9.0. En outre, la fonction sns.pairplot()n'a pas besoin de la ligne deget_figure()
Scott Yang

9

Moins de lignes pour les chercheurs 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')

NOTE DE MISE À JOUR: a sizeété changé en height.


3

Cela fonctionne pour moi

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

Il est également possible de créer simplement un figureobjet matplotlib puis d'utiliser 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

Vous obtiendrez une erreur pour l'utilisation sns.figure.savefig("output.png")dans seaborn 0.8.1.

Utilisez plutôt:

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

Juste pour info, la commande ci-dessous fonctionnait dans seaborn 0.8.1 donc je suppose que la réponse initiale est toujours valable.

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

Bien que ce code fonctionne, il n'est pas complet. Le titre dit: «Comment enregistrer un tracé Seaborn dans un fichier», ce qui est plus général. Malheureusement, la solution proposée fonctionne avec pairplot, mais elle soulève une exception avec d'autres «types» de parcelles. Espérons que dans les prochaines versions, il y aura un moyen plus unifié d'obtenir l'objet «figure» à partir d'un complot marin.
Salvatore Cosentino
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.