web-dev-qa-db-fra.com

Tracer des images côte à côte à l'aide de matplotlib

Je me demandais comment je pouvais tracer des images côte à côte à l'aide de matplotlib, par exemple, comme ceci:

 enter image description here

Le plus proche que j'ai eu est la suivante:

 enter image description here

Cela a été produit en utilisant ce code:

f, axarr = plt.subplots(2,2)
axarr[0,0] = plt.imshow(image_datas[0])
axarr[0,1] = plt.imshow(image_datas[1])
axarr[1,0] = plt.imshow(image_datas[2])
axarr[1,1] = plt.imshow(image_datas[3])

Mais je n'arrive pas à faire apparaître les autres images. Je pense qu'il doit y avoir une meilleure façon de le faire, car j'imagine qu'il serait difficile de gérer les index. J'ai parcouru la documentation bien que j’ai l’impression que je me trompe peut-être. Est-ce que quelqu'un pourrait me donner un exemple ou me diriger dans la bonne direction? 

18
YellowPillow

Le problème que vous rencontrez est que vous essayez de affecter le retour de imshow (qui est un matplotlib.image.AxesImage à un objet axes existant. 

La manière correcte de tracer des données d’image sur les différents axes dans axarr serait:

f, axarr = plt.subplots(2,2)
axarr[0,0].imshow(image_datas[0])
axarr[0,1].imshow(image_datas[1])
axarr[1,0].imshow(image_datas[2])
axarr[1,1].imshow(image_datas[3])

Le concept est le même pour toutes les sous-parcelles et, dans la plupart des cas, l'instance d'axes fournit les mêmes méthodes que l'interface pyplot (plt). Par exemple. Si ax est l'un de vos axes de sous-parcelle, vous utiliseriez ax.plot(..) au lieu de plt.plot() pour tracer un tracé de courbe normal. Cela peut être trouvé exactement dans le source depuis la page vers laquelle vous créez un lien

28

Vous tracez toutes vos images sur un seul axe. Ce que vous voulez, c'est obtenir une poignée pour chaque axe individuellement et y tracer vos images. Ainsi:

fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax1.imshow(...)
ax2 = fig.add_subplot(2,2,2)
ax2.imshow(...)
ax3 = fig.add_subplot(2,2,3)
ax3.imshow(...)
ax4 = fig.add_subplot(2,2,4)
ax4.imshow(...)

Pour plus d'informations, regardez ici: http://matplotlib.org/examples/pylab_examples/subplots_demo.html

Pour les mises en page complexes, vous devriez envisager d'utiliser gridspec: http://matplotlib.org/users/gridspec.html

12
Sven Festersen

Une chose que j'ai trouvé très utile d'utiliser:

_, axs = plt.subplots(n_row, n_col, figsize=(12, 12))
axs = axs.flatten()
for img, ax in Zip(imgs, axs):
    ax.imshow(img)
    plt.show()
0
YellowPillow