web-dev-qa-db-fra.com

Comment enregistrer un complot Seaborn dans un fichier

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 je reçois 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'

Je m'attends à ce que le output.png final existe et ressemble à ceci:

 enter image description here

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

90
neversaint

Supprimez le get_figure et utilisez simplement 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")
78
Folkong

Les solutions suggérées sont incompatibles avec Seaborn 0.8.1

donnant les erreurs suivantes parce que l'interface Seaborn a été modifiée:

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 .

UPDATE: J'ai récemment utilisé un objet PairGrid de seaborn pour générer un tracé similaire à celui de cet exemple . Dans ce cas, GridPlot n'étant pas un objet de tracé tel que, Par exemple, sns.swarmplot, il n’a pas de fonction get_figure () . Il est possible d’accéder directement à la figure matplotlib par

fig = myGridPlotObject.fig

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

111
Salvatore Cosentino

Certaines des solutions ci-dessus n'ont pas fonctionné pour moi. L'attribut .fig n'a pas été trouvé lorsque j'ai essayé et je ne pouvais pas utiliser directement .savefig(). Cependant, ce qui fonctionnait é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.

21
D.Mercer

Vous devriez juste pouvoir utiliser directement la méthode savefig de sns_plot.

sns_plot.savefig("output.png")

Pour plus de clarté avec votre code, si vous souhaitez accéder à la figure matplotlib dans laquelle réside sns_plot, vous pouvez l’obtenir directement avec

fig = sns_plot.fig

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

13
Simon Gibbons

J'utilise distplot et get_figure pour enregistrer l'image avec succès.

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

Vous obtiendrez une erreur en utilisant 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")
1
prashar

Il est également possible de créer un objet matplotlib figure et d'utiliser ensuite 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
tttthomasssss

Ça marche 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')
1
Niraj D Pandey