Что такое цветовая панель (colorbar) и зачем она нужна?
Цветовая панель (colorbar) в Matplotlib — это визуальный элемент, который сопоставляет числовые значения с цветами. Она служит ключом к пониманию данных, представленных на графике в виде цветовой шкалы, например, на тепловых картах (heatmaps) или контурных графиках (contour plots). Без цветовой панели интерпретация таких графиков была бы затруднительной. Она позволяет быстро оценить диапазоны значений и их распределение.
Проблема несоответствия высоты цветовой панели и графика
Распространенная проблема при создании визуализаций в Matplotlib — несоответствие высоты цветовой панели и графика. По умолчанию, цветовая панель может быть короче или длиннее графика, что выглядит неэстетично и может сбивать с толку при анализе данных. Необходимо, чтобы высота цветовой панели соответствовала высоте графика для создания профессионально выглядящей и легко читаемой визуализации.
Основные способы создания цветовой панели в Matplotlib
Стандартный способ создания цветовой панели с помощью plt.colorbar()
Самый простой способ добавить цветовую панель — использовать функцию plt.colorbar(). Она автоматически создает цветовую панель, связанную с последним графическим элементом (например, результатом imshow() или pcolormesh()), который был отрисован.
import matplotlib.pyplot as plt
import numpy as np
# Сгенерируем случайные данные
data: np.ndarray = np.random.rand(10, 10)
# Создадим тепловую карту
image = plt.imshow(data)
# Добавим цветовую панель
plt.colorbar(image)
plt.show()
Создание цветовой панели с использованием ScalarMappable
Более гибкий подход — использовать ScalarMappable. Этот метод позволяет создать цветовую панель независимо от отрисованных графических элементов. Это особенно полезно, когда требуется настроить параметры цветовой панели более тонко или когда цветовая панель должна отображать значения, не привязанные напрямую к существующему графику.
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
from matplotlib.colors import Normalize, ScalarMappable
# Сгенерируем случайные данные
data: np.ndarray = np.random.rand(10, 10)
# Создадим ScalarMappable
norm = Normalize(vmin=data.min(), vmax=data.max())
cmap = cm.viridis
m = ScalarMappable(norm=norm, cmap=cmap)
# Создадим тепловую карту
image = plt.imshow(data, cmap=cmap, norm=norm)
# Добавим цветовую панель
plt.colorbar(m)
plt.show()
Способы синхронизации высоты цветовой панели и графика
Использование аргумента ‘ax’ в plt.colorbar() для указания оси
Один из самых простых способов добиться соответствия высоты — явно указать ось графика в качестве аргумента ax в функции plt.colorbar(). Это привязывает цветовую панель к указанной оси, обеспечивая соответствие размеров.
import matplotlib.pyplot as plt
import numpy as np
# Сгенерируем случайные данные
data: np.ndarray = np.random.rand(10, 10)
# Создадим график
fig, ax = plt.subplots()
image = ax.imshow(data)
# Добавим цветовую панель, указав ось
plt.colorbar(image, ax=ax)
plt.show()
Создание осей для графика и цветовой панели вручную с помощью GridSpec
Более сложный, но и более гибкий способ — создать оси для графика и цветовой панели вручную, используя GridSpec. Это позволяет точно контролировать расположение и размеры обоих элементов.
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
# Сгенерируем случайные данные
data: np.ndarray = np.random.rand(10, 10)
# Создадим GridSpec
fig = plt.figure()
gs = gridspec.GridSpec(1, 2, width_ratios=[10, 1]) # Соотношение ширины графика и цветовой панели
# Создадим оси для графика и цветовой панели
ax = plt.subplot(gs[0])
cax = plt.subplot(gs[1])
# Создадим тепловую карту
image = ax.imshow(data)
# Добавим цветовую панель
plt.colorbar(image, cax=cax)
plt.show()
Использование constrained_layout для автоматической настройки расположения
Функция constrained_layout автоматически регулирует расположение подграфиков и цветовых панелей, чтобы избежать перекрытий и обеспечить оптимальное использование пространства. Это упрощает создание сложных визуализаций с несколькими графиками и цветовыми панелями.
import matplotlib.pyplot as plt
import numpy as np
# Сгенерируем случайные данные
data: np.ndarray = np.random.rand(10, 10)
# Создадим график с constrained_layout
fig, ax = plt.subplots(constrained_layout=True)
image = ax.imshow(data)
# Добавим цветовую панель
plt.colorbar(image)
plt.show()
Примеры кода для различных сценариев
Простой пример с одним графиком и цветовой панелью одинаковой высоты
import matplotlib.pyplot as plt
import numpy as np
# Сгенерируем случайные данные
data: np.ndarray = np.random.rand(10, 10)
# Создадим график
fig, ax = plt.subplots()
image = ax.imshow(data)
# Добавим цветовую панель, указав ось
plt.colorbar(image, ax=ax)
plt.show()
Пример с несколькими подграфиками и общей цветовой панелью
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gridspec
# Сгенерируем случайные данные
data1: np.ndarray = np.random.rand(10, 10)
data2: np.ndarray = np.random.rand(10, 10)
# Создадим GridSpec
fig = plt.figure(figsize=(10, 5))
gs = gridspec.GridSpec(1, 3, width_ratios=[1, 1, 0.1])
# Создадим оси для подграфиков и цветовой панели
ax1 = plt.subplot(gs[0])
ax2 = plt.subplot(gs[1])
cax = plt.subplot(gs[2])
# Создадим тепловые карты
im1 = ax1.imshow(data1)
im2 = ax2.imshow(data2)
# Добавим общую цветовую панель
fig.colorbar(im2, cax=cax)
plt.tight_layout()
plt.show()
Пример с пользовательской цветовой картой (colormap)
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors as mcolors
# Сгенерируем случайные данные
data: np.ndarray = np.random.rand(10, 10)
# Создадим пользовательскую цветовую карту
colors = [(0, 0, 1), (0, 1, 0), (1, 0, 0)] # Синий, Зеленый, Красный
cmap = mcolors.LinearSegmentedColormap.from_list("CustomCmap", colors, N=256)
# Создадим график
fig, ax = plt.subplots()
image = ax.imshow(data, cmap=cmap)
# Добавим цветовую панель
plt.colorbar(image, ax=ax)
plt.show()
Заключение
Краткое повторение изученных методов
В этой статье мы рассмотрели несколько способов создания цветовых панелей в Matplotlib с высотой, соответствующей высоте графика: использование аргумента ax в plt.colorbar(), ручное создание осей с помощью GridSpec и использование constrained_layout для автоматической настройки расположения.
Рекомендации по выбору оптимального метода в зависимости от задачи
- Для простых графиков с одной осью лучшим выбором будет использование аргумента
axвplt.colorbar(). Это самый простой и быстрый способ. - Если требуется более сложная компоновка с несколькими подграфиками и общей цветовой панелью, используйте
GridSpec. Это дает полный контроль над расположением элементов. - Для автоматической настройки расположения и избежания перекрытий используйте
constrained_layout. Это особенно полезно при создании сложных визуализаций.