web-dev-qa-db-fra.com

Matplotlib savefig image trim

L'exemple de code suivant produira un tracé de ligne de base sans axes et l'enregistrera en tant que fichier SVG:

import matplotlib.pyplot as plt
plt.axis('off')
plt.plot([1,3,1,2,3])
plt.plot([3,1,1,2,1])
plt.savefig("out.svg", transparent = True)

Comment définir la résolution/les dimensions de l'image? Il y a un remplissage sur tous les côtés de l'image au-delà du graphique linéaire. Comment supprimer le rembourrage pour que les lignes apparaissent sur le bord de l'image?

28
oden

Je suis toujours étonné du nombre de façons de faire la même chose dans matplotlib.
En tant que tel, je suis sûr que quelqu'un peut rendre ce code beaucoup plus concis.
Quoi qu'il en soit, cela devrait clairement montrer comment résoudre votre problème.

>>> import pylab
>>> fig = pylab.figure()

>>> pylab.axis('off')
(0.0, 1.0, 0.0, 1.0)
>>> pylab.plot([1,3,1,2,3])
[<matplotlib.lines.Line2D object at 0x37d8cd0>]
>>> pylab.plot([3,1,1,2,1])
[<matplotlib.lines.Line2D object at 0x37d8d10>]

>>> fig.get_size_inches()    # check default size (width, height)
array([ 8.,  6.])
>>> fig.set_size_inches(4,3) 
>>> fig.get_dpi()            # check default dpi (in inches)
80
>>> fig.set_dpi(40)

# using bbox_inches='tight' and pad_inches=0 
# I managed to remove most of the padding; 
# but a small amount still persists
>>> fig.savefig('out.svg', transparent=True, bbox_inches='tight', pad_inches=0)

Documentation pour savefig().

50
bernie

L'objet d'axe par défaut laisse une certaine place pour les titres, les étiquettes de graduation et similaires. Créez votre propre objet d'axe qui remplit toute la zone:

fig=figure()
ax=fig.add_axes((0,0,1,1))
ax.set_axis_off()
ax.plot([3,1,1,2,1])
ax.plot([1,3,1,2,3])
fig.savefig('out.svg')

Au format svg, je ne vois pas la ligne qui se trouve tout en bas, mais au format png, je peux donc, c'est probablement une fonctionnalité du rendu svg. Vous voudrez peut-être ajouter juste un petit rembourrage pour garder tout visible.

3
Jouni K. Seppänen