2010-06-28 3 views
25

Le code exemple suivant produira un tracé de la ligne de base sans axes et l'enregistrer comme un fichier SVG:Matplotlib image de garniture

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

Répondre

45

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 laconique. En tout cas, 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().

+4

Y at-il un moyen de les mettre dans matplotlibrc? 'Bad key" savefig.bbox_inches "' – endolith

+0

Vous êtes les bienvenus. Je ne sais pas s'il est possible de fournir de telles spécifications de configuration en utilisant un fichier matplotlibrc. – bernie

+0

Une autre commande que j'aime utiliser (en conjonction avec celles listées ci-dessus) de pyplot est plt.tight_layout(), qui supprime l'espace blanc en excès autour de la figure. – Blink

2

L'objet axe par défaut laisse de la place pour les titres, les graduations et autres. Faites votre propre objet de l'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') 

En format svg Je ne vois pas la ligne qui est juste en bas, mais au format .png je peux, il est donc probablement une caractéristique du svg renderer . Vous pourriez vouloir ajouter juste un peu de remplissage pour garder tout visible.

+0

Correct. Vous pouvez ajuster la position des axes dans la figure en faisant les axes manuellement. La commande pyplot (ou pylab) pour faire un axe inclut ceci dans sa docstring: axes (rect, axisbg = 'w') où rect = [gauche, bas, largeur, hauteur] en unités normalisées (0,1). axisbg est la couleur de fond de l'axe, blanc par défaut – timbo