web-dev-qa-db-fra.com

Matplotlib: Enregistrer la figure en tant que fichier depuis le bloc-notes iPython

J'essaie d'enregistrer une figure Matplotlib en tant que fichier à partir d'un bloc-notes iPython.

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_axes([1,1,1,1])
ax.plot([1,2])

fig.savefig('test.png')

La vue en ligne du bloc-notes iPython semble bonne:

Inline view of figure in iPython notebook


Le fichier 'test.png' est cependant presque vide. Il semble que l'intrigue soit décalée en haut à droite, vous pouvez voir les étiquettes de graduation '1.0' et '0.0' dans le coin.

test.png

Comment puis-je produire un fichier à partir du bloc-notes iPython qui ressemble à la vue en ligne?

22
Martin Preusse

Problème résolu: ajoutez 'bbox_inches='tight' argument pour savefig.

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_axes([1,1,1,1])
plt.plot([1,2])

savefig('test.png', bbox_inches='tight')

Je ne comprends pas ce qui se passe ici, mais le fichier ressemble maintenant au fichier en ligne du bloc-notes iPython. Yay.

21
Martin Preusse

En fait, le savefig fonctionne correctement. Lorsque vous appelez add_axes, Votre liste spécifie un rectangle: [left, bottom, width, height]. Étant donné que la figure passe de 0 à 1 sur les deux axes avec l'origine en bas à gauche, vous créez un rectangle de largeur et de hauteur 1 à partir du haut à droite de la figure. Vous voudrez probablement faire ax = fig.add_axes([0,0,1,1]).

Je ne sais pas pourquoi le tracé en ligne ne respecte pas l'endroit où vous avez placé les axes. Si je devais deviner, je dirais que le backend en ligne chiffre automatiquement la boîte englobante et place la figure en ligne en fonction de cela.

5
tbekolay