Gráficos de imágenes 2D con pcolormesh en Matplotlib

MatplotlibMatplotlibBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este tutorial, aprenderemos a usar la función pcolormesh de la biblioteca Matplotlib para generar gráficos en estilo de imagen bidimensional. Cubriremos el uso básico de pcolormesh, pcolormesh no rectilíneo, coordenadas centradas y la creación de niveles usando normas.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

pcolormesh básico

Por lo general, especificamos un pcolormesh definiendo el borde de los cuadriláteros y el valor del cuadrilátero. Tenga en cuenta que aquí x e y tienen un elemento adicional en cada dimensión en comparación con Z.

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 no rectilíneo

Tenga en cuenta que también podemos especificar matrices para X e Y y tener cuadriláteros no rectilíneos.

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  ## inclina las coordenadas.
Y = Y + 0.3 * X

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

Coordenadas centradas

A menudo, un usuario desea pasar X e Y con los mismos tamaños que Z a .axes.Axes.pcolormesh. Esto también está permitido si se pasa shading='auto' (valor predeterminado establecido por :rc:pcolor.shading). Antes de Matplotlib 3.3, shading='flat' eliminaba la última columna y la última fila de Z, pero ahora da un error. Si esto es realmente lo que desea, entonces simplemente elimine manualmente la última fila y la última columna de Z:

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'")

Creación de niveles usando normas

Muestra cómo combinar instancias de Normalización y Colormap para dibujar "niveles" en gráficos de tipo .axes.Axes.pcolor, .axes.Axes.pcolormesh y .axes.Axes.imshow de manera similar al argumento de palabras clave levels para contour/contourf.

import matplotlib.pyplot as plt
import numpy as np

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

## haz estos más pequeños para aumentar la resolución
dx, dy = 0.05, 0.05

## genera 2 mallas 2d para los límites de x & 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 e y son límites, entonces z debe ser el valor *dentro* de esos límites.
## Por lo tanto, elimina el último valor del array z.
z = z[:-1, :-1]
niveles = MaxNLocator(nbins=15).tick_values(z.min(), z.max())


## elige la colormap deseada, niveles sensatos y define una instancia de normalización
## que toma valores de datos y los traduce en niveles.
cmap = plt.colormaps['PiYG']
norm = BoundaryNorm(niveles, 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 con niveles')


## los contornos son gráficos *basados en puntos*, entonces convierte nuestro límite en
## centros de puntos
cf = ax1.contourf(x[:-1, :-1] + dx/2.,
                  y[:-1, :-1] + dy/2., z, niveles=niveles,
                  cmap=cmap)
fig.colorbar(cf, ax=ax1)
ax1.set_title('contourf con niveles')

## ajusta el espaciado entre subgráficos para que el título de `ax1` y las etiquetas de
## marcas de `ax0` no se solapen
fig.tight_layout()

plt.show()

Resumen

En este tutorial, aprendimos cómo usar la función pcolormesh en la biblioteca Matplotlib. Cubrimos el uso básico de pcolormesh, pcolormesh no rectilíneo, coordenadas centradas y la creación de niveles usando normas. Estas técnicas se pueden utilizar para generar diferentes tipos de gráficos estilo imagen 2D en Matplotlib.