Comment changer la forme d'une figure (aspect ratio) avec imshow de matplotlib ?

Published: 06 février 2018

DMCA.com Protection Status

Exemple de comment changer la forme d'une figure (aspect ratio) avec imshow de matplotlib:

Avec matplotlib, quand on utilise imshow et extent on peut parfois obtenir une figure avec une forme ("apect ratio": rapport entre la largeur et la hauteur) non désirée (forme trop allongée par exemple):

import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(50,1000)

plt.imshow(data, extent=[-1,1,-10,10])
plt.savefig("imshow_extent_custum_aspect_ratio_01.png", bbox_inches='tight')
plt.close()

Modifier la forme d'une figure (
Modifier la forme d'une figure ("apect ratio") avec imshow et extent sous matplotlib size:20

L'option imshow 'aspect'

il est possible de changer l'aspect ratio en ajoutant une option dans la fonction imshow, comme ceci:

plt.imshow(data, extent=[-1,1,-10,10],aspect='auto')

ou

plt.imshow(data, extent=[-1,1,-10,10],aspect=10)

Créer sa fonction 'aspect ratio':

Cependant, il est difficile d'ajuster correctement (ou d'automatiser) la forme en utilisant l'argument aspect de la fonction imshow. On peut alors écrire une simple fonction (source) pour controller la forme ("aspect ratio") de la figure, exemple:

import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(50,1000)

def forceAspect(ax,aspect):
    im = ax.get_images()
    extent =  im[0].get_extent()
    ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.imshow(data, extent=[-1,1,-10,10])
forceAspect(ax,aspect=0.5)
fig.savefig("imshow_extent_custum_aspect_ratio_02.png", bbox_inches='tight')

Modifier la forme d'une figure (
Modifier la forme d'une figure ("apect ratio") avec imshow et extent sous matplotlib

avec

 forceAspect(ax,aspect=1.0)

Modifier la forme d'une figure (
Modifier la forme d'une figure ("apect ratio") avec imshow et extent sous matplotlib

Exemple avec une barre de couleurs

Un exemple avec une barre de couleurs:

Modifier la forme d'une figure (
Modifier la forme d'une figure ("apect ratio") avec imshow et extent sous matplotlib

import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(50,1000)

def forceAspect(ax,aspect):
    im = ax.get_images()
    extent =  im[0].get_extent()
    ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect)

fig = plt.figure()
ax = fig.add_subplot(111)

img = plt.imshow(data, extent=[-1,1,-10,10])
forceAspect(ax,aspect=1.0)


v1 = np.linspace(data.min(), data.max(), 8, endpoint=True)
cb = plt.colorbar(ticks=v1)
cb.ax.set_yticklabels(["{:4.2f}".format(i) for i in v1], fontsize='7')

fig.savefig("imshow_extent_custum_aspect_ratio_04.png", bbox_inches='tight')

Références

Image

of