web-dev-qa-db-fra.com

Définir la taille de la toile de traçage dans Matplotlib

Je voudrais que Matplotlib/Pyplot génère des tracés avec une taille de toile cohérente. C'est-à-dire que les figures peuvent avoir différentes tailles pour s'adapter aux descriptions des axes, mais la zone de traçage (le rectangle dans lequel les courbes sont dessinées) doit toujours avoir la même taille.

Y a-t-il un moyen simple d'y parvenir? L'option figsize de pyplot.figure () semble définir la taille globale de la figure, et non celle de la zone de travail, de sorte que la taille de la zone de travail est différente lorsque la description de l'axe occupe plus ou moins d'espace.

14
Dario

C'est l'une de mes plus grandes frustrations avec Matplotlib. Je travaille souvent avec des données raster où, par exemple, je veux ajouter une palette de couleurs, une légende et un titre. Tout exemple simple tiré de la galerie matplotlib entraînera une résolution différente et donc des données rééchantillonnées. Surtout lorsque vous effectuez une analyse d'image, vous ne voulez pas de ré-échantillonnage (non désiré).

Voici ce que je fais habituellement, bien que j'aimerais savoir s'il existe des moyens plus simples ou meilleurs.

Commençons par charger une image et la sortir telle quelle avec la même résolution:

import matplotlib.pyplot as plt
import urllib2

# load the image
img = plt.imread(urllib2.urlopen('http://upload.wikimedia.org/wikipedia/en/thumb/5/56/Matplotlib_logo.svg/500px-Matplotlib_logo.svg.png'))

# get the dimensions
ypixels, xpixels, bands = img.shape

# get the size in inches
dpi = 72.
xinch = xpixels / dpi
yinch = ypixels / dpi

# plot and save in the same size as the original
fig = plt.figure(figsize=(xinch,yinch))

ax = plt.axes([0., 0., 1., 1.], frameon=False, xticks=[],yticks=[])
ax.imshow(img, interpolation='none')

plt.savefig('D:\\mpl_logo.png', dpi=dpi, transparent=True)

Notez que j'ai défini manuellement la position des axes de manière à couvrir toute la figure.

De la même manière que ci-dessus, vous pouvez ajouter une marge autour de l'image pour permettre l'utilisation d'étiquettes ou de barres de couleur, etc.

Cet exemple ajoute une marge de 20% au-dessus de l'image, qui est ensuite utilisée pour tracer un titre:

fig = plt.figure(figsize=(xinch,yinch/.8))

ax = plt.axes([0., 0., 1., .8], frameon=False, xticks=[],yticks=[])
ax.imshow(img, interpolation='none')
ax.set_title('Matplotlib is fun!', size=16, weight='bold')

plt.savefig('D:\\mpl_logo_with_title.png', dpi=dpi)

Ainsi, la taille y (hauteur) est augmentée et la taille y des axes est diminuée de manière égale. Cela donne une image de sortie plus grande (globale), mais la zone des axes aura toujours la même taille. 

Ce peut être bien d'avoir une figure ou une propriété d'axes comme .set_scale () pour forcer une vraie sortie 1-sur-x. 

12
Rutger Kassies

Vous pouvez spécifier les paramètres suivants dans Matplotlib rc:

import matplotlib
matplotlib.rcParams['figure.figsize'] = [10, 10] # for square canvas
matplotlib.rcParams['figure.subplot.left'] = 0
matplotlib.rcParams['figure.subplot.bottom'] = 0
matplotlib.rcParams['figure.subplot.right'] = 1
matplotlib.rcParams['figure.subplot.top'] = 1
0
Piotr Jurkiewicz