Appearance
9. Визуализация матриц и двумерных логов: imshow() и тепловые карты
Отображение двумерных массивов данных
Перевод чисел матрицы в пиксели холста
До этого момента вы учились строить графики на основе одномерных структур (линий, точек или столбцов). Однако в Data Science и инженерии искусственного интеллекта базовые структуры данных практически всегда являются многомерными. Нам постоянно приходится работать с матрицами весов скрытых слоев нейросетей, картами признаков (Feature Maps) в компьютерном зрении, корреляционными матрицами табличных датасетов или логами двумерных пространств.
Для наглядного графического отображения двумерного массива numpy.ndarray или таблицы pandas.DataFrame в виде пиксельной тепловой карты (Heatmap) используется метод координатной сетки ax.imshow(X).
Метод ax.imshow() принимает на вход двумерную матрицу чисел и интерпретирует каждую её ячейку как отдельный квадратный пиксель на экране. Цвет этого пикселя жестко привязан к численному значению ячейки в соответствии с выбранной цветовой картой.
Понятие цветовых палитр (Color maps — cmap)
Визуальное восприятие матрицы критически зависит от параметра cmap. В Matplotlib встроены десятки готовых цветовых шкал, которые делятся на несколько базовых типов:
- Последовательные (Sequential): Плавный переход от светлого к темному оттенку одного цвета (например,
"Blues","Purples"). Идеально подходит для отображения сугубо положительных непрерывных величин — весов, вероятностей или пикселей картинок. - Расходящиеся (Diverging): Градиент, в котором центральное нейтральное значение (обычно
0.0) окрашено в блеклый цвет, а экстремальные отклонения в левую и правую стороны подсвечиваются контрастными яркими цветами (например,"coolwarm","RdBu"). Это незаменимый инструмент для дебага весов нейросетей, где нужно сразу видеть перекос в сторону огромных положительных или глубоких отрицательных параметров.
python
import numpy
import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
# Generating a simple 3x3 numeric grid array
matrix_data = numpy.array([[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]])
# Rendering matrix using continuous blue sequential gradient palette
ax.imshow(matrix_data, cmap="Blues")Инструменты кастомизации матричных пространств
Добавление цветовой шкалы через colorbar()
Тепловая карта сама по себе абстрактна: зритель видит градиент, но не знает, какому именно числу соответствует конкретный оттенок цвета. Чтобы снабдить карту точной измерительной шкалой, используется функция холста fig.colorbar(mappable, ax).
В качестве параметра mappable ей передается объект, возвращенный методом ax.imshow(). Функция пририсовывает к указанной координатной сетке вертикальный или горизонтальный столбец-индикатор со значениями.
Циклическое аннотирование ячеек матрицы через ax.text()
При работе с небольшими матрицами (например, корреляционными матрицами фичей или матрицами ошибок) хорошим тоном является подписание точного числового значения прямо поверх каждого пикселя.
Для этого пишется стандартный двойной вложенный цикл for, который итерируется по строкам и столбцам матрицы, и для каждой ячейки вызывает метод добавления кастомного текста на холст — ax.text(x, y, text, ha, va). Параметры ha="center" и va="center" (horizontal/vertical alignment) гарантируют идеальное центрирование цифр внутри пиксельных квадратов.
python
import numpy
import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
matrix = numpy.array([[10, 20], [30, 40]])
# Saving the returned mappable image object
img = ax.imshow(matrix, cmap="coolwarm")
# Adding the absolute matching color measurement scalar bar scale
fig.colorbar(img, ax=ax)
# Annotating text layout numbers over individual cells programmatically
for row in range(2):
for col in range(2):
cell_value = matrix[row, col]
ax.text(col, row, str(cell_value), ha="center", va="center", color="white")Прямоугольные ячейки с явными координатами: ax.pcolormesh()
imshow() интерпретирует массив как растровое изображение: ячейки одинаковые, квадратные, а их координаты совпадают с индексами строк и столбцов. Когда данные живут на непрямоугольной сетке — например, результаты 2D-поиска гиперпараметров по логарифмическим шкалам, — удобнее метод ax.pcolormesh(X, Y, C). Он принимает два массива узлов координат X и Y (обычно построенных через numpy.meshgrid()) и матрицу значений C: границы каждой ячейки определяются координатами узлов, а не пикселями.
python
import numpy
import matplotlib.pyplot
lambda_grid = numpy.array([0.01, 0.1, 1.0, 10.0])
lr_grid = numpy.array([1e-4, 1e-3, 1e-2])
lambda_mesh, lr_mesh = numpy.meshgrid(lambda_grid, lr_grid)
# Validation scores of a 2D hyperparameter search
score_matrix = numpy.array([
[0.71, 0.75, 0.68, 0.60],
[0.82, 0.90, 0.83, 0.72],
[0.86, 0.88, 0.81, 0.74]
])
fig, ax = matplotlib.pyplot.subplots()
# Each cell border is derived from the explicit node coordinates
mesh = ax.pcolormesh(lambda_mesh, lr_mesh, score_matrix, cmap="viridis")
fig.colorbar(mesh, ax=ax)На линейной шкале видно, как неравномерные шаги координат растягивают ячейки в прямоугольники разной ширины. Именно это отличает pcolormesh() от пиксельной модели imshow().
Упражнения базовые (5 шт) (только с опорой на объясненную в данном уроке теорию)
1. Построение базовой тепловой карты матрицы
Задача: Дана простая числовая матрица: numpy.array([[0.1, 0.9], [0.4, 0.5]]). Создайте холст и осей, отобразите этот массив в виде тепловой карты с дефолтной палитрой.
Посмотреть решение
python
import numpy
import matplotlib.pyplot
matrix_data = numpy.array([[0.1, 0.9], [0.4, 0.5]])
# Simple 2D image array matrix pixel projection
fig, ax = matplotlib.pyplot.subplots()
ax.imshow(matrix_data)2. Смена градиентной палитры на расходящуюся coolwarm
Задача: На основе матрицы из предыдущего упражнения постройте тепловую карту, принудительно применив расходящуюся цветовую палитру "coolwarm" для наглядной подсветки контрастов.
Посмотреть решение
python
import numpy
import matplotlib.pyplot
matrix_data = numpy.array([[0.1, 0.9], [0.4, 0.5]])
# Updating color scheme map mapping via the cmap argument
fig, ax = matplotlib.pyplot.subplots()
ax.imshow(matrix_data, cmap="coolwarm")3. Пририсовывание измерительной шкалы Colorbar
Задача: Постройте тепловую карту для матрицы numpy.eye(3) (единичная матрица 3x3 через numpy.eye). Сохраните результат вызова .imshow() в переменную img_map и пририсуйте к графику шкалу соответствия цветов с помощью метода холста fig.colorbar().
Посмотреть решение
python
import numpy
import matplotlib.pyplot
identity_matrix = numpy.eye(3)
fig, ax = matplotlib.pyplot.subplots()
# Storing the image map metadata reference
img_map = ax.imshow(identity_matrix, cmap="Purples")
# Attaching color scale matching bar tracking components
fig.colorbar(img_map, ax=ax)4. Ручное циклическое нанесение текста на матрицу 2x2
Задача: Создайте тепловую карту для матрицы matrix = numpy.array([[5, 12], [8, 1]). Напишите двойной вложенный цикл for, который с помощью метода ax.text() напечатает точные строковые значения чисел в центре каждой из 4 ячеек.
Посмотреть решение
python
import numpy
import matplotlib.pyplot
matrix = numpy.array([[5, 12], [8, 1]])
fig, ax = matplotlib.pyplot.subplots()
ax.imshow(matrix, cmap="YlGn")
# Running nested loops to overlay data markers over row/col coordinates indices
for i in range(2):
for j in range(2):
ax.text(x=j, y=i, s=str(matrix[i, j]), ha="center", va="center")5. Текстовое аннотирование осей тепловой карты
Задача: Постройте тепловую карту любой матрицы. Добавьте к координатной сетке главный заголовок "Weights Activation Patterns Mapping", подпись горизонтальной оси X — "Hidden Neurons Columns", подпись вертикальной оси Y — "Input Features Rows".
Посмотреть решение
python
import numpy
import matplotlib.pyplot
fig, ax = matplotlib.pyplot.subplots()
ax.imshow(numpy.zeros((2, 2)))
# Mutating structural metadata text sub-nodes configurations
ax.set_title("Weights Activation Patterns Mapping")
ax.set_xlabel("Hidden Neurons Columns")
ax.set_ylabel("Input Features Rows")Упражнения смешанные (5 шт) (включают материал прошлых уроков)
6. Headless-визуализация матрицы весов, случайно сгенерированной по Гауссу в NumPy
Задача: С помощью современного Generator API (rng.normal) инициализируйте веса скрытого слоя в виде двумерной матрицы weights_layer размерностью (5, 5) со средним 0.0 и стандартным отклонением 1.0 (Урок 17 модуля NumPy). Переведите Matplotlib в неинтерактивный режим работы (Урок 3 модуля Matplotlib). Постройте тепловую карту полученных параметров, применив расходящуюся контрастную палитру "RdBu" (Урок 9 модуля Matplotlib). Пририсуйте шкалу colorbar и автоматически экспортируйте полученную карту весов в файл "weights_heatmap.png" (Урок 3 / Урок 9 модуля Matplotlib).
Посмотреть решение
python
import numpy
import matplotlib
# Activating headless engine block strictly before graphics pipelines callouts (Lesson 3)
matplotlib.use('Agg')
import matplotlib.pyplot
# Generating Gaussian random 2D matrix layer (NumPy Lesson 17)
rng = numpy.random.default_rng(seed=42)
weights_layer = rng.normal(loc=0.0, scale=1.0, size=(5, 5))
fig, ax = matplotlib.pyplot.subplots(figsize=(6, 6))
# Rendering Diverging heatmap chart for layers debugging (Matplotlib Lesson 9)
image_reference = ax.imshow(weights_layer, cmap="RdBu")
ax.set_title("Neural Network Layer Weight Heatmap Profile")
ax.set_xlabel("Output Neurons Channel Index")
ax.set_ylabel("Input Signals Channel Index")
fig.colorbar(image_reference, ax=ax)
# Dumping frame straight to server file storage (Matplotlib Lesson 3)
fig.savefig("weights_heatmap.png")7. Построение тепловой карты корреляционной матрицы фичей из датасета Pandas
Задача: Загрузите очищенный табличный датасет параметров из файла "metrics_warehouse.parquet" (Урок 8 модуля Pandas). В Pandas встроен метод .corr(), который вычисляет коэффициенты корреляции Пирсона между всеми столбцами, возвращая квадратную DataFrame-таблицу. Посчитайте эту матрицу корреляций. Настройте headless-режим (Урок 3 модуля Matplotlib). Оберните полученную таблицу в тепловую карту ax.imshow(), применив палитру "coolwarm" (Урок 9 модуля Matplotlib). Подпишите оси именами фичей, передав список колонок df.columns в методы ax.set_xticklabels() и ax.set_yticklabels(). Сохраните результат в файл "correlation_matrix.png".
Посмотреть решение
python
import pandas
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot
# Loading parquet tracking data structure from disk storage (Pandas Lesson 8)
dataset_df = pandas.read_parquet(path="metrics_warehouse.parquet")
# Computing pandas linear correlation matrix layout (Pandas Lesson 5)
correlation_matrix = dataset_df.corr()
fig, ax = matplotlib.pyplot.subplots(figsize=(8, 8))
img = ax.imshow(correlation_matrix.values, cmap="coolwarm")
ax.set_title("Features Correlation Pearson Matrix")
# Adjusting axes ticks tags mapping to showcase columns metadata strings labels
ax.set_xticks(range(len(dataset_df.columns)))
ax.set_yticks(range(len(dataset_df.columns)))
ax.set_xticklabels(dataset_df.columns, rotation=45)
ax.set_yticklabels(dataset_df.columns)
fig.colorbar(img, ax=ax)
fig.tight_layout() # Saving margins spaces (Matplotlib Lesson 8)
fig.savefig("correlation_matrix.png")8. Аннотирование подматрицы сигналов из CSV-файла после очистки дубликатов и NaN
Задача: Прочитайте текстовый файл "raw_telemetry.csv", ограничив чтение столбцами признаков ["f1", "f2"] (Урок 8 модуля Pandas). Удалите из таблицы полностью идентичные строки-дубликаты (Урок 9 модуля Pandas). Заполните все оставшиеся пропуски NaN константой 0.0 на месте (Урок 9 модуля Pandas). Выделите из таблицы компактный батч первых двух строк с помощью позиционного среза .iloc[0:2] (Урок 6 модуля Pandas). Переведите полученную подматрицу признаков 2x2 в сырой массив NumPy методом .to_numpy() (Урок 11 модуля Pandas). В неинтерактивном режиме постройте тепловую карту этого массива (Урок 9). Наложите точные числовые значения признаков поверх ячеек с помощью циклов и метода ax.text() (Урок 9). Сохраните результат в "telemetry_heatmap.png".
Посмотреть решение
python
import pandas
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot
# Ingesting raw table configurations from disk (Pandas Lesson 8)
raw_df = pandas.read_csv(filepath_or_buffer="raw_telemetry.csv", usecols=["f1", "f2"])
# Purging duplicates and patching missing floats tokens fields (Pandas Lesson 9)
raw_df.drop_duplicates(inplace=True)
raw_df.fillna(0.0, inplace=True)
# Slicing target sub-matrix row instances and exporting to C-array layout (Pandas Lessons 6 & 11)
matrix_2d = raw_df.iloc[0:2, :].to_numpy()
fig, ax = matplotlib.pyplot.subplots()
ax.imshow(matrix_2d, cmap="YlGnBu")
ax.set_title("Sanitized Signals Telemetry Batch Matrix 2x2")
# Nested loops execution overlaying precision text labels digits (Matplotlib Lesson 9)
for row in range(2):
for col in range(2):
scalar_metric = matrix_2d[row, col]
ax.text(x=col, y=row, s=f"{scalar_metric:.2f}", ha="center", va="center")
fig.savefig("telemetry_heatmap.png")9. Мультипанельное side-by-side сравнение двух матриц активаций NumPy
Задача: Сгенерируйте две независимые матрицы скрытых признаков объектов: layer_A = numpy.arange(9).reshape(3, 3) и layer_B = numpy.arange(9, 18).reshape(3, 3) (Урок 3 / Урок 11 модуля NumPy). Настройте неинтерактивный режим работы (Урок 3). Создайте комплексный мультипанельный холст, состоящий из 1 строки и 2 столбцов графиков (Урок 8 модуля Matplotlib). В первом окне (axes) постройте тепловую карту layer_A с последовательной палитрой "Greens" (Урок 9). Во втором окне (axes) постройте тепловую карту layer_B с палитрой "Purples". Примените к обеим координатным сеткам команду выравнивания отступов fig.tight_layout() и выгрузите результат в "layers_imshow.png".
Посмотреть решение
python
import numpy
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot
# Generating independent 2D matrix layout layers via numpy (NumPy Lessons 3 & 11)
layer_A = numpy.arange(9).reshape(3, 3)
layer_B = numpy.arange(9, 18).reshape(3, 3)
# Initializing 1x2 split panels grid canvas (Matplotlib Lesson 8)
fig, axes = matplotlib.pyplot.subplots(nrows=1, ncols=2, figsize=(10, 5))
# Panel 0: Sequential Green matrix pixel projection (Matplotlib Lesson 9)
img_A = axes.imshow(layer_A, cmap="Greens")
axes.set_title("Layer A Activation Matrix")
fig.colorbar(img_A, ax=axes)
# Panel 1: Sequential Purple matrix pixel projection
img_B = axes.imshow(layer_B, cmap="Purples")
axes.set_title("Layer B Activation Matrix")
fig.colorbar(img_B, ax=axes)
fig.tight_layout()
fig.savefig("layers_imshow.png")10. Сквозной поиск документации по методам пиксельного рендеринга imshow в Jupyter
Задача: Напишите строку кода для выполнения в ячейке Jupyter Notebook, которая открывает интерактивную Docstring-инструкцию по встроенному методу рендеринга двумерных массивов matplotlib.axes.Axes.imshow с помощью символа интроспекции (Урок 1 модуля NumPy / Урок 1 модуля Pandas).
Посмотреть решение
python
import matplotlib.axes
# Running this statement inside a notebook layout pops up the comprehensive API configuration instructions
?matplotlib.axes.Axes.imshow