Построение двумерных изображений в Matplotlib с использованием pcolormesh

Beginner

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

Введение

В этом уроке мы узнаем, как использовать функцию pcolormesh из библиотеки Matplotlib для генерации графиков в стиле 2D-изображений. Мы рассмотрим базовое использование pcolormesh, не прямоугольные pcolormesh, координаты, центрированные относительно ячеек сетки и создание уровней с использованием нормативных значений.

Советы по использованию ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Основное использование pcolormesh

Обычно мы задаем pcolormesh, определяя края четырехугольников и значения для каждого из них. Обратите внимание, что здесь x и y в каждой размерности имеют на один элемент больше, чем 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

Обратите внимание, что мы также можем задавать матрицы для X и Y, чтобы получить непрямоугольные четырехугольники.

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  ## наклоняем координаты.
Y = Y + 0.3 * X

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

Центрированные координаты

Часто пользователь хочет передать X и Y с одинаковыми размерами, как у Z, в .axes.Axes.pcolormesh. Это также допустимо, если передать shading='auto' (значение по умолчанию, заданное :rc:pcolor.shading). До Matplotlib 3.3 shading='flat' удалял последний столбец и строку Z, но теперь выдаёт ошибку. Если это действительно то, что вы хотите, то просто вручную удалите последнюю строку и столбец 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'")

Создание уровней с использованием нормативных значений

Показывает, как комбинировать экземпляры Нормализации и Колормапы для рисования "уровней" в типах графиков .axes.Axes.pcolor, .axes.Axes.pcolormesh и .axes.Axes.imshow аналогично аргументу ключевого слова levels для contour/contourf.

import matplotlib.pyplot as plt
import numpy as np

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

## сделайте эти значения меньше, чтобы увеличить разрешение
dx, dy = 0.05, 0.05

## сгенерируйте 2 двумерных сетки для границ 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 и y - это границы, поэтому z должен быть значением *внутри* этих границ.
## Поэтому удалите последнее значение из массива z.
z = z[:-1, :-1]
уровни = MaxNLocator(nbins=15).tick_values(z.min(), z.max())


## выберите желаемую карту цветов, разумные уровни и определите экземпляр
## нормализации, который берет значения данных и преобразует их в уровни.
cmap = plt.colormaps['PiYG']
norm = BoundaryNorm(уровни, 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 с уровнями')


## контуры - это графики *по точкам*, поэтому преобразуйте наши границы в
## центры точек
cf = ax1.contourf(x[:-1, :-1] + dx/2.,
                  y[:-1, :-1] + dy/2., z, levels=уровни,
                  cmap=cmap)
fig.colorbar(cf, ax=ax1)
ax1.set_title('contourf с уровнями')

## уточните расстояние между подграфиками, чтобы надпись `ax1` и метки
## делений `ax0` не пересекались
fig.tight_layout()

plt.show()

Резюме

В этом руководстве мы узнали, как использовать функцию pcolormesh из библиотеки Matplotlib. Мы рассмотрели базовое использование pcolormesh, непрямоугольный pcolormesh, центрированные координаты и создание уровней с использованием нормативных значений. Эти методы можно использовать для генерации различных типов графиков в стиле 2D-изображений в Matplotlib.