web-dev-qa-db-fra.com

Barplot savefig () retournant une AttributeError

Je convertis un bloc-notes iPython en un script python, essayant simplement de produire les résultats de quelques tracés Seaborn sous forme de fichiers png. Code:

import seaborn as sns

...

sns.set_style("whitegrid")
ax = sns.barplot(x=range(1,11), y=[ (x/nrows)*100 for x in addr_pop ], palette="Blues_d")
ax.savefig("html/addr_depth.png")

Ne vous inquiétez pas pour les variables, elles sont remplies comme prévu et j'obtiens un superbe graphique dans iPyNB. Cependant, l'exécution du code dans un script donne RuntimeError: Invalid DISPLAY variable.

Suite à un autre thread, j'ai modifié le code, en le plaçant en haut du script:

import matplotlib
matplotlib.use('Agg')

Et réessayé. Cette fois, il ne semble pas que la méthode savefig() soit disponible pour l'intrigue:

AttributeError: 'AxesSubplot' object has no attribute 'savefig'

Tous les résultats recherchant cette erreur sont liés à pandas et à un tracé qui est déjà affiché. J'essaie juste d'obtenir Seaborn pour sortir la figue dans un fichier, idéalement sans l'afficher à tout.

Toute aide est appréciée.

15
economy

J'ai résolu le problème en changeant

ax.savefig('file.png')

à

ax.figure.savefig('file.png')

Je suppose que l'accès direct à la figure est un moyen d'accéder à la méthode savefig() pour le barplot.

@WoodChopper a également une solution qui fonctionne, mais elle nécessite une autre instruction d'importation et l'utilisation directe de savefig() de pyplot.

L'une ou l'autre solution nécessite de définir matplotlib.use('Agg') pour contourner l'erreur de variable DISPLAY. Comme le article référencé l'a noté, cela doit être défini avant d'importer d'autres bibliothèques matplotlib.

34
economy

Je suppose que vous devriez importer pyplot.

import matplotlib.pyplot as plt
plt.savefig()
8
WoodChopper