Как установить цветовую полосу в matplotlib?

Matplotlib — популярная библиотека Python, используемая для визуализации данных и построения графиков. Она предоставляет широкий спектр настраиваемых типов графиков и опций для создания информативных и эстетически привлекательных графиков. Одной из полезных функций matplotlib является возможность добавлять цветные полосы к графикам. Цветные полосы обеспечивают визуальное представление того, как цветовая карта соответствует значениям данных. Это позволяет читателям легко интерпретировать значимость цветов на графике. В этом подробном руководстве мы рассмотрим все, что вам нужно знать о настройке цветных полос на графиках matplotlib.

Что такое цветовая полоса?

Цветовая полоса, также известная как легенда цветовой карты, — это визуальное средство, сопоставляющее значения данных с цветами. Она предоставляет шкалу, которая помогает читателям приравнивать цвета к количествам или интенсивностям. Цветовая полоса отображает спектр цветов, перемещающийся от одного конечного цвета, представляющего минимальные значения, к другому конечному цвету, представляющему максимальные значения. Промежуточные значения отображаются в виде переходов между конечными оттенками цветов. Это дает визуализацию цветового градиента на графике.

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

Когда использовать цветовую полосу

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

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

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

Анатомия цветовой полосы

Базовая вертикальная цветовая полоса состоит из:

  • Цветовой спектр — отображает градиент цветов от низких к высоким значениям
  • Деления — указывает конкретные значения данных, соответствующие цветовым оттенкам
  • Метки делений — метки для делений, отображающие их числовые значения
  • Заголовок — описательный заголовок, объясняющий, что представляет цветовая полоса

Цветовой спектр визуально связывает значения данных с цветами. Деления и метки количественно определяют эту связь. Заголовок описывает значимость цветовой полосы. Аналогичные компоненты присутствуют и в горизонтальных цветовых полосах.

Как добавить цветовую полосу на графики Matplotlib

Matplotlib предоставляет класс Colorbar для простого добавления цветовых полос на графики. Вот основные шаги для добавления вертикальной цветовой полосы на существующие оси matplotlib:

  1. Создайте график с помощью цветовой карты.
  2. Получите цветовую карту, используемую для указания цветов.
  3. Создайте объект Colorbar, указав цветовую карту.
  4. Добавьте цветовую полосу на график с помощью экземпляра осей matplotlib.

Это добавляет вертикальную цветовую полосу по умолчанию на график. Давайте рассмотрим пример:

“`python
import matplotlib.pyplot as plt
import numpy as np

# Создание данных
data = np.random.randn(10,10)

# Построение тепловой карты с помощью imshow с горячей цветовой картой
fig, ax = plt.subplots()
im = ax.imshow(data, cmap='hot')

# Получение цветовой карты
cmap = im.cmap

# Создание цветовой полосы
cbar = fig.colorbar(im, cmap=cmap)

plt.show()
“`

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

Вертикальная цветовая шкала

Цветовая шкала добавляется к той же фигуре, что и график по умолчанию. Чтобы сделать цветовую полосу вертикальной, задайте параметру ориентации в Colorbar значение «vertical»:

“`python
cbar = fig.colorbar(im, cmap=cmap, orientation='vertical')
“`

Горизонтальная цветовая полоса

Чтобы создать горизонтальную цветовую полосу под графиком, укажите ориентацию как «horizontal»:

“`python
cbar = fig.colorbar(im, cmap=cmap, orientation='horizontal')
“`

Позиционирование цветовой полосы

Мы можем указать расположение цветовой полосы с помощью параметра ax. Для вертикальной цветовой шкалы:

“`python
cbar = fig.colorbar(im, cmap=cmap, ax=ax, location='right') # Размещает цветовую шкалу справа от графика
“`

Для горизонтальной цветовой шкалы:

“`python
cbar = fig.colorbar(im, cmap=cmap, ax=ax, orientation='horizontal', location='bottom') # Размещает цветовую шкалу под графиком
“`

Это позволяет расположить цветовую шкалу в нужном месте на подграфике осей.

Настройка цветовой шкалы

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

Настройка толщины цветовой полосы

Используйте параметр shrink для настройки толщины цветовой полосы:

“`python
cbar = fig.colorbar(im, cmap=cmap, shrink=0.6) # Меньшее значение делает цветовую полосу толще
“`

Настройка делений и меток делений

Делания и метки делений можно задать явно, передав расположение делений и метки делений в Colorbar:

“`python
ticks = [0, 2, 4, 6, 8, 10]
tick_labels = ['Min', 'Low', 'Medium', 'High', 'Max']

cbar = fig.colorbar(im, cmap=cmap, ticks=ticks, tick_labels=tick_labels)
“`

Добавление заголовка

Заголовок можно добавить с помощью метода set_label():

“`python
cbar = fig.colorbar(im, cmap=cmap)
cbar.set_label('Температура (°C)')
“`

Установка пределов цвета

Диапазон цветовой карты можно задать с помощью аргументов vmin и vmax. Это настраивает цветовой спектр:

“`python
im = ax.imshow(data, cmap='hot', vmin=0, vmax=100)
“`

Это сопоставит значения данных от 0 до 100 с горячей цветовой картой.

Использование логарифмической шкалы

Чтобы использовать логарифмическую шкалу цветовой карты, где равные шаги в данных представлены неравными шагами в цветовой карте, мы можем передать norm=LogNorm():

“`python
im = ax.imshow(data, cmap='hot', norm=LogNorm())
“`

Это сопоставляет данные логарифмически с цветовой картой.

Установка количества тактов

Используйте параметр ticks в Colorbar, чтобы задать приблизительное количество тактов:

“`python
cbar = fig.colorbar(im, cmap=cmap, ticks=5) # Устанавливает ~5 делений
“`

Форматирование меток делений

Метки делений можно форматировать для фиксированной точности с помощью ScalarFormatter:

“`python
import matplotlib.ticker as ticker

formatter = ticker.ScalarFormatter(useMathText=True)
formatter.set_scientific(True)
formatter.set_powerlimits((-2, 2))

cbar = fig.colorbar(im, cmap=cmap)
cbar.locator = ticker.MaxNLocator(5)
cbar.formatter = formatter
cbar.update_ticks()
“`

Это форматирует метки делений в экспоненциальном представлении с 2 десятичными знаками.

Настройка свойств шрифта

Свойства шрифта, такие как размер шрифта, насыщенность, семейство, можно задать для меток делений, меток осей и заголовка:

“`python
cbar.ax.tick_params(labelsize=14)
cbar.ax.xaxis.label.set_fontweight('bold')
cbar.ax.set_title('Temperature', fontname='Times New Roman', fontsize=16)
“`

Это позволяет стилизовать шрифт в соответствии с желаемыми характеристиками.

Настройка расширений цветной полосы

Длину цветной полосы можно увеличить за пределы графика с помощью параметра extend:

“`python
cbar = fig.colorbar(im, cmap=cmap, extend='both')
“`

Это расширяет цветовую полосу с обоих концов, что полезно, когда значения данных выходят за пределы отображаемого диапазона.

Добавление цветовой полосы к вторичным осям

Для графиков с несколькими осями Y мы можем связать цветовую полосу с определенной осью Y, передав соответствующий экземпляр оси:

“`python
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))

# График 1
im1 = ax1.imshow(data1, cmap='Reds')
cbar1 = fig.colorbar(im1, ax=ax1)

# График 2
im2 = ax2.imshow(data2, cmap='Blues')
cbar2 = fig.colorbar(im2, ax=ax2) # Цветовая шкала связана с ax2
“`

Это позволяет иметь независимые цветовые шкалы для каждой оси подграфика.

Лучшие практики использования цветовых шкал

Вот несколько советов по эффективному использованию цветовых шкал в matplotlib:

  • Используйте цветовые шкалы только в том случае, если цветовая карта сопоставлена со значениями данных. Избегайте использования в графиках с категориальными цветами.
  • Опишите, что представляет цветовая полоса, с помощью заголовка.
  • Убедитесь, что количество делений и меток делений точно передает масштаб цветовой карты.
  • Используйте параметры расширения, если значения данных выходят за пределы диапазона цветовой полосы.
  • Отформатируйте метки делений соответствующим образом, чтобы четко передавать значения.
  • Установите толщину цветовой полосы, чтобы она выделялась, но не заслоняла график.
  • Разместите цветовую полосу близко к графику для легкой ассоциативности.
  • Сделайте цветовую полосу достаточно большой, чтобы ее было легко читать.
  • Используйте соответствующие цветовые карты на основе данных и аудитории.

Следуя этим рекомендациям, вы получите информативные и визуально привлекательные цветовые полосы!

Расширенная настройка цветовой полосы

Для большего контроля цветовую полосу можно создать напрямую, создав экземпляр объекта Colorbar. Это включает в себя создание осей для цветовой шкалы, нанесение на нее изображения цветовой шкалы и настройку свойств осей. Вот пример:

“`python
import matplotlib as mpl

# Создать рисунок и оси
fig = plt.figure(figsize=(6, 5))
ax = fig.add_subplot(111)

# Сгенерировать график
im = ax.imshow(data, norm=LogNorm(), cmap='coolwarm')

# Создать новые оси для цветовой шкалы
cax = fig.add_axes([0.95, 0.2, 0.03, 0.6])

# Создать цветовую шкалу
norm = mpl.colors.Normalize(vmin=data.min(), vmax=data.max())
cb = mpl.colorbar.ColorbarBase(cax, cmap=cmap, norm=norm)

# Установка положений отметок и добавление меток
cb.set_ticks([2, 4, 6, 8, 10])
cax.set_yticklabels(['Low', 'Medium', 'High'])

# Установка заголовка цветовой шкалы
cb.set_label('Colorbar Title')

plt.show()
“`

Это позволяет осуществлять детальный контроль свойств цветовой шкалы. Однако для большинства целей рекомендуется использовать простой метод fig.colorbar().

Цветовые карты в Matplotlib

Выбор цветовой карты важен для эффективной визуализации. Matplotlib предоставляет широкий спектр встроенных цветовых карт на выбор. Вот некоторые полезные цветовые карты для числовых данных:

  • hot — спектр от черного до красного
  • viridis — спектр от синего до желтого
  • plasma — спектр от синего до красного
  • inferno — спектр от желтого до красного
  • magma — спектр от белого до красного
  • cividis — оптимизирован для людей с нарушениями цветового зрения

Они обеспечивают перцептивно однородные градиенты, подходящие для представления упорядоченных данных. Цветовые карты, такие как jet, не рекомендуются, поскольку они могут вносить визуальные артефакты. Качественные цветовые карты, такие как tab10, доступны для категориальных данных. Полный список цветовых карт можно просмотреть с помощью:

“`python
import matplotlib.pyplot as plt
plt.colormaps()
“`

Это отображает все доступные параметры цветовых карт для выбора.

Цветовые полосы в Seaborn

Seaborn — это статистическая библиотека визуализации, созданная на основе matplotlib. Он также позволяет добавлять цветные полосы через аргумент cbar_kws:

“`python
import seaborn as sns

# Построение тепловой карты
heatmap = sns.heatmap(data, cbar_kws={'label': 'Colorbar Title'})

# Доступ к объекту цветовой полосы
cbar = heatmap.figure.get_axes()[1]

# Настройка отметок, меток и т. д. цветовой полосы
“`

Тепловая карта Seaborn обрабатывает создание цветовой полосы, возвращая оси цветовой полосы для дальнейшей настройки.

Цветовые полосы с Pandas и Matplotlib

Для данных, хранящихся в Pandas DataFrames, мы можем использовать методы построения графиков DataFrame, чтобы легко создавать графики с цветовыми полосами:

“`python
import pandas as pd
df = pd.DataFrame(data)

# Построить тепловую карту
ax = df.plot.imshow(cmap='plasma')

# Добавить цветовую полосу
fig = ax.get_figure()
fig.colorbar(ax.collections[0], ax=ax)
“`

Это использует интеграцию Pandas с matplotlib для построения графиков DataFrames с цветовыми полосами.

Цветовые полосы Plotly

Plotly — это еще одна библиотека Python для построения графиков, которая поддерживает добавление цветовых полос. Вот пример:

“`python
import plotly.express as px

# Create figure
fig = px.imshow(data, color_continuous_scale='Viridis')

# Update color axis
fig.update_coloraxes(colorbar_title='Colorbar Title')

fig.show()
“`

Plotly предоставляет функциональность colorbar через свойства цветовой оси.

Примеры цветовых полос Matplotlib

Давайте рассмотрим несколько примеров добавления цветовых полос к различным типам графиков matplotlib:

Цветовая полоса для тепловой карты

“`python
import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((10,10))

fig, ax = plt.subplots()
im = ax.imshow(data, cmap='Wistia')

cbar = fig.colorbar(im, ax=ax)
cbar.set_label('Brightness')

plt.show()
“`

Это сопоставляет случайные данные с цветами с помощью цветовой карты Wistia и добавляет цветовую полосу, представляющую яркость.

Цветовая полоса для контурного графика

“`python
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 500)
y = np.linspace(-3, 3, 500)
X, Y = np.meshgrid(x, y)
Z = np.exp(-X**2 – Y**2)

fig, ax = plt.subplots()
cp = ax.contour(X, Y, Z, levels=np.logspace(-2, 0, 10))
fig.colorbar(cp, ax=ax, label='Height')

plt.show()
“`

Это создает контурный график для трехмерной поверхности exp(-x^2 – y^2) и добавляет цветовую шкалу, показывающую уровни высоты для контурных линий.

Цветовая шкала для Pcolormesh

“`python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 5, 500)
y = np.linspace(0, 5, 500)
X, Y = np.meshgrid(x, y)
Z = np.cos(X**2 + Y**2