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()
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')
avec
forceAspect(ax,aspect=1.0)
Exemple avec une barre de couleurs
Un exemple avec une barre de couleurs:
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
Liens | Site |
---|---|
How can I set the aspect ratio in matplotlib? | stackoverflow |
matplotlib imshow display ratio fix to square | stackoverflow |
Imshow: extent and aspect | stackoverflow |
change figure size and figure format in matplotlib | stackoverflow |