2025, Dec 31 09:05

Отрисовка пути на сетке 5×5 в matplotlib: маска и RGB

Как в Python и matplotlib отрисовать путь на сетке 5×5: превращаем координаты в 2D‑маску, используем imshow и палитру или RGB, точно выравниваем линии сетки.

Отрисовать дискретный путь поверх небольшой сетки можно без сложных инструментов. Если у вас есть последовательность клеточных координат, превратите её в простую маску и позвольте matplotlib сделать остальное: закрасьте путь и пустые клетки разными цветами и нарисуйте линии сетки, чтобы границы каждой ячейки были явно видны.

Постановка задачи

Путь — это последовательность координат на поле 5×5. Вот точный ввод:

route_cells = [(4, 4), (4, 3), (3, 3), (2, 3), (2, 4), (1, 4), (0, 4), (0, 3), (0, 2), (1, 2), (1, 1), (1, 0), (0, 0)]

Где могут возникнуть сложности

Единственный неочевидный момент — как превратить этот список пар в формат, который библиотека быстро «закрасит», и как получить линии сетки ровно по границам ячеек. В matplotlib не нужно рисовать каждый прямоугольник вручную. Достаточно 2D‑массива и дискретной палитры: одно значение — фон, другое — путь. Линии сетки включаются прямо на осях, а установка делений на полуцелые значения выравнивает их по границам клеток.

Минимальное решение на matplotlib

Фрагмент ниже превращает путь в маску 5×5, применяет двухцветную палитру, чтобы отделить путь от фона, и поверх рисует линии сетки.

import matplotlib.pyplot as plt
from matplotlib import colors
import numpy as np
# Маршрут задан координатами на сетке
route_cells = [(4, 4), (4, 3), (3, 3), (2, 3), (2, 4), (1, 4), (0, 4), (0, 3), (0, 2), (1, 2), (1, 1), (1, 0), (0, 0)]
# Строим маску 5x5: 1 для клеток пути, 0 для фона
mask_grid = np.zeros((5, 5))
for i, j in route_cells:
    mask_grid[i][j] = 1
# Два дискретных цвета для значений 0 и 1
palette = colors.ListedColormap(["red", "blue"])  # подойдут любые контрастные цвета
levels = [0, 1, 2]  # граница при значении >= 1
scale = colors.BoundaryNorm(levels, palette.N)
# Отображаем сетку с выделенным путём
fig, ax = plt.subplots()
ax.imshow(mask_grid, cmap=palette, norm=scale)
# Рисуем линии сетки по границам ячеек
ax.grid(which="major", axis="both", linestyle="-", color="k", linewidth=2)
ax.set_xticks(np.arange(-.5, 5, 1))
ax.set_yticks(np.arange(-.5, 5, 1))
plt.show()

Такой подход сразу даёт контрастный путь на решётке 5×5 без дополнительных примитивов. Конкретные цвета не важны — нужны лишь два отчётливо различимых оттенка.

Вариант без цветовой карты

Если вам нужны фиксированные цвета, например белый и красный, можно обойтись без палитры и задать RGB напрямую. Суть в том, чтобы создать массив 5×5×3, заранее заполненный белым, и перезаписать клетки пути красным. Параметр extent в imshow избавит от ручной расстановки делений.

import matplotlib.pyplot as plt
from matplotlib.colors import to_rgb
import numpy as np
# Маршрут тот же
route_cells = [(4, 4), (4, 3), (3, 3), (2, 3), (2, 4), (1, 4), (0, 4), (0, 3), (0, 2), (1, 2), (1, 1), (1, 0), (0, 0)]
# Сначала заполняем белым, затем закрашиваем клетки пути красным
rgb_field = np.ones((5, 5, 3))
for i, j in route_cells:
    rgb_field[i, j] = to_rgb("red")
fig, ax = plt.subplots()
ax.imshow(rgb_field, extent=[0, 5, 0, 5])
plt.show()

Зачем это знать

Кодирование категориальной информации в небольшую числовую сетку легко масштабируется от учебных набросков до реальных задач. Вы избегаете поклеточных циклов рисования и несколькими строками управляете контрастом и выравниванием. Тот же приём одинаково хорошо подходит для путей, масок и любых бинарных или дискретных наложений на сетку.

Итоги

Представьте путь как бинарную маску в 2D‑массиве, примените дискретное отображение цветов для разделения фона и пути и выровняйте линии сетки, поставив деления на полуцелых. Если требуются фиксированные цвета, ещё проще закрасить массив RGB. Оба способа остаются компактными, понятными и делают ровно то, что нужно для подсветки пути на сетке.