5.9. Pcolormesh - псевдоцветная сетка

Мы уже видели, что с помощью метода imshow можно отображать двумерные массивы в виде изображений. Однако, иногда возникает необходимость не отображать определенные ячейки (пиксели) или сделать так что бы ячейки были разного размера. Так же иногда необходимо отображать саму границу между ячейками. Для таких нужд нам и пригодится метод pcolormesh.

Несколько примеров

В самом простом случае метод pcolormesh принимает всего один аргумент - двумерный массив чисел:

import numpy as np
import matplotlib.pyplot as plt

c = [[ 0, 1, 2, 3],
     [ 4, 5, 6, 7],
     [ 8, 9, 10, 11],
     [12, 13, 14, 15]]

fig, ax = plt.subplots()

ax.pcolormesh(c)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"

plt.show()

Matplotlib pcolormesh

Мы можем легко задавать размеры ячеек. Как это работает легче всего разобрать на графике с небольшим количеством ячеек:

import numpy as np
import matplotlib.pyplot as plt

c = [[5, 1, 2],
     [2, 8, 0],
     [1, 0, 12]]

x = [0, 2, 4, 7]
y = [3, 4, 6, 9]

fig, ax = plt.subplots()

ax.pcolormesh(x, y, c)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib pcolormesh: размеры ячеек сетки

В этом примере мы указали еще два параметра - массив x и массив y, которые на 1 больше длинны и ширины массива c. Эти массивы и задают ширину столбцов и высоту строк сетки и благодаря им можем записать координаты углов каждой ячейки, например, координаты самой левой нижней ячейки запишутся как:

          (0, 4)           (2, 4)
                +---------+
                | c[2][0] |
                +---------+
          (0, 3)           (2, 3)

Или в общем случае для каждой ячейки:

(x[i+1, j], y[i+1, j])          (x[i+1, j+1], y[i+1, j+1])
                      +--------+
                      | c[i,j] |
                      +--------+
    (x[i, j], y[i, j])          (x[i, j+1], y[i, j+1])

Массивы x и y могут и совпадать с длинной и шириной массива c, но в этом случае последний столбец и последняя строка массива c будут игнорироваться:

import numpy as np
import matplotlib.pyplot as plt

c = [[5, 1, 2, 1],
     [2, 8, 0, 2],
     [1, 0, 12, 1]]

#  Длинна x и y совпадает с длиной
#  и шириной c:
x = [0, 2, 4, 7]
y = [3, 4, 6]

fig, ax = plt.subplots()

ax.pcolormesh(x, y, c)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib pcolormesh: игнорирование последней строки и столбца при одинаковом размере сетки и данных

Более того, ячейки даже не обязаны быть прямоугольными:

import numpy as np
import matplotlib.pyplot as plt

c = [[5, 1, 2, 1],
     [2, 8, 0, 2],
     [1, 0, 12, 1]]

x = [[4, 6, 8, 10, 12],
     [3, 5, 8, 11, 13],
     [2, 4, 8, 12, 14],
     [0, 6, 8, 10, 9]]

y = [0, 1, 2, 3]

fig, ax = plt.subplots()

ax.pcolormesh(x, y, c)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib pcolormesh: непрямоугольная сетка

И еще один пример, в котором ячейки имеют неправильную форму:

import numpy as np
import matplotlib.pyplot as plt

c = [[5, 1, 2, 1],
     [2, 8, 0, 2],
     [1, 0, 12, 1]]

x = [[4, 6, 8, 10, 12],
     [3, 5, 8, 11, 13],
     [2, 4, 8, 12, 14],
     [3, 6, 8, 10, 13]]

y = [[0,-0.5,-1,-0.5,0],
     [0.5,1,1,1,0.5],
     [1.5,2,2,2,1.5],
     [2.5,3,2.5,3,2.5]]

fig, ax = plt.subplots()

ax.pcolormesh(x, y, c)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib pcolormesh: ячейки сетки неправильной формы

Как видите, форму каждой ячейки мы задали сначала одним двумерным массивом x, а во втором случае с помощью двумерных массивов x и y. В первом примере видно, что ячейки могут даже перекрывать друг друга, т.е. фактически, единственное за чем нужно следить, так это за совместимостью размеров массивов x и y. Если их размеры совместимы, то само содержание массивов может быть каким угодно даже случайным:

import numpy as np
import matplotlib.pyplot as plt

c = [[5, 1, 2, 1],
     [2, 8, 0, 2],
     [1, 0, 12, 1]]

x = np.random.randint(0, 10, size = (4, 5))
y = np.random.randint(0, 10, size = (4, 5))

fig, ax = plt.subplots()

ax.pcolormesh(x, y, c)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib pcolormesh: случайное размещение узлов сетки


Прозрачность

В случае неравномерной сетки ячейки действительно могут перекрывать друг друга, в этом легко убедиться, если добавить параметр alpha, который задает прозрачность ячеек и может принимать значение из интервала [0, 1]:

import numpy as np
import matplotlib.pyplot as plt

c = [[5, 1, 2, 1],
     [2, 8, 0, 2],
     [1, 0, 12, 1]]

x = np.random.randint(1, 20, size = (4, 5))

y = np.random.randint(1, 3, size = (4, 5))

fig, ax = plt.subplots()

ax.pcolormesh(x, y, c, alpha = 0.3)

fig.set_figwidth(8)    #  ширина и
fig.set_figheight(8)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib pcolormesh: прозрачность


Линии сетки

Задать цвет линий сетки а так же их параметры можно с помощью множества параметров. Цвет задается параметром edgecolors, а их ширину с помощью параметра linewidth:

import numpy as np
import matplotlib.pyplot as plt

c = [[0, 1, 2, 3],
     [1, 2, 3, 4],
     [2, 3, 4, 5]]

x = [[4, 6, 8, 10, 12],
     [3, 5, 8, 11, 13],
     [2, 4, 8, 12, 14],
     [3, 6, 8, 10, 13]]

y = [[0,-0.5,-1,-0.5,0],
     [0.5,1,1,1,0.5],
     [1.5,2,2,2,1.5],
     [2.5,3,2.5,3,2.5]]

fig, ax = plt.subplots()

ax.pcolormesh(x, y, c,
              cmap = 'spring',
              edgecolors = 'r',
              linewidth = 3)

fig.set_figwidth(10)    #  ширина и
fig.set_figheight(10)    #  высота "Figure"
fig.set_facecolor('floralwhite')
ax.set_facecolor('seashell')

plt.show()

Matplotlib pcolormesh: линии сетки