Traçage d'images 2D avec pcolormesh dans Matplotlib

Beginner

This tutorial is from open-source community. Access the source code

Introduction

Dans ce tutoriel, nous allons apprendre à utiliser la fonction pcolormesh de la bibliothèque Matplotlib pour générer des graphiques de type image 2D. Nous aborderons l'utilisation de base de pcolormesh, le pcolormesh non rectiligne, les coordonnées centrées et la création de niveaux à l'aide de normes.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder à Jupyter Notebook pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session et nous réglerons rapidement le problème pour vous.

pcolormesh de base

Nous spécifions généralement un pcolormesh en définissant le bord des quadrilatères et la valeur du quadrilatère. Notez que ici, x et y ont chacun un élément supplémentaire par rapport à Z dans la dimension respective.

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)
Z = np.random.rand(6, 10)
x = np.arange(-0.5, 10, 1)  ## len = 11
y = np.arange(4.5, 11, 1)  ## len = 7

fig, ax = plt.subplots()
ax.pcolormesh(x, y, Z)

pcolormesh non rectiligne

Notez que nous pouvons également spécifier des matrices pour X et Y et avoir des quadrilatères non rectilignes.

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)
Z = np.random.rand(6, 10)
x = np.arange(-0.5, 10, 1)  ## len = 11
y = np.arange(4.5, 11, 1)  ## len = 7
X, Y = np.meshgrid(x, y)
X = X + 0.2 * Y  ## inclinez les coordonnées.
Y = Y + 0.3 * X

fig, ax = plt.subplots()
ax.pcolormesh(X, Y, Z)

Coordonnées centrées

Souvent, un utilisateur veut passer X et Y de la même taille que Z à .axes.Axes.pcolormesh. Cela est également autorisé si shading='auto' est passé (valeur par défaut définie par :rc:pcolor.shading). Avant Matplotlib 3.3, shading='flat' supprimait la dernière colonne et la dernière ligne de Z, mais maintenant cela génère une erreur. Si c'est vraiment ce que vous voulez, alors supprimez simplement la dernière ligne et la dernière colonne de Z manuellement :

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)
Z = np.random.rand(6, 10)
x = np.arange(10)  ## len = 10
y = np.arange(6)  ## len = 6
X, Y = np.meshgrid(x, y)

fig, axs = plt.subplots(2, 1, sharex=True, sharey=True)
axs[0].pcolormesh(X, Y, Z, vmin=np.min(Z), vmax=np.max(Z), shading='auto')
axs[0].set_title("shading='auto' = 'nearest'")
axs[1].pcolormesh(X, Y, Z[:-1, :-1], vmin=np.min(Z), vmax=np.max(Z),
                  shading='flat')
axs[1].set_title("shading='flat'")

Création de niveaux à l'aide de normes

Montre comment combiner des instances de Normalization et de Colormap pour tracer des "niveaux" dans les graphiques de type .axes.Axes.pcolor, .axes.Axes.pcolormesh et .axes.Axes.imshow de manière similaire à l'argument clé levels pour contour/contourf.

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator

## Rendre ces valeurs plus petites pour augmenter la résolution
dx, dy = 0.05, 0.05

## Générer 2 grilles 2D pour les limites x et y
y, x = np.mgrid[slice(1, 5 + dy, dy),
                slice(1, 5 + dx, dx)]

z = np.sin(x)**10 + np.cos(10 + y*x) * np.cos(x)

## x et y sont des limites, donc z devrait être la valeur *à l'intérieur* de ces limites.
## Par conséquent, supprimer la dernière valeur du tableau z.
z = z[:-1, :-1]
levels = MaxNLocator(nbins=15).tick_values(z.min(), z.max())


## Sélectionner la colormap souhaitée, des niveaux sensés et définir une instance de normalisation
## qui prend les valeurs de données et les traduit en niveaux.
cmap = plt.colormaps['PiYG']
norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True)

fig, (ax0, ax1) = plt.subplots(nrows=2)

im = ax0.pcolormesh(x, y, z, cmap=cmap, norm=norm)
fig.colorbar(im, ax=ax0)
ax0.set_title('pcolormesh avec niveaux')


## Les contours sont des graphiques *basés sur des points*, donc convertir nos limites en points
## centraux
cf = ax1.contourf(x[:-1, :-1] + dx/2.,
                  y[:-1, :-1] + dy/2., z, levels=levels,
                  cmap=cmap)
fig.colorbar(cf, ax=ax1)
ax1.set_title('contourf avec niveaux')

## Ajuster l'espacement entre les sous-graphiques pour que le titre d'`ax1` et les étiquettes d'échelle d'`ax0`
## ne se chevauchent pas
fig.tight_layout()

plt.show()

Sommaire

Dans ce tutoriel, nous avons appris à utiliser la fonction pcolormesh de la bibliothèque Matplotlib. Nous avons abordé l'utilisation de base de pcolormesh, le pcolormesh non rectiligne, les coordonnées centrées et la création de niveaux à l'aide de normes. Ces techniques peuvent être utilisées pour générer différents types de graphiques de style image 2D dans Matplotlib.