Как изменить цвет ячейки таблицы в Matplotlib в зависимости от значения?

Зачем раскрашивать ячейки таблиц?

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

Обзор возможностей Matplotlib для создания таблиц

Matplotlib предоставляет гибкие средства для создания таблиц. Основные функции для этой цели – plt.table() и ax.table(). plt.table() используется, когда необходимо создать таблицу как часть общего графика, а ax.table() – когда таблица является отдельным элементом, размещенным на осях координат (Axes). Обе функции позволяют настраивать внешний вид таблицы, включая шрифт, размеры ячеек, границы и, что наиболее важно, цвета ячеек.

Создание базовой таблицы в Matplotlib

Импорт необходимых библиотек (matplotlib, numpy)

Прежде чем приступить к созданию и раскрашиванию таблиц, необходимо импортировать библиотеки matplotlib и numpy.

import matplotlib.pyplot as plt
import numpy as np

Подготовка данных для таблицы (numpy array, pandas DataFrame)

Данные для таблицы могут быть представлены в виде numpy array или pandas DataFrame. В контексте, например, анализа рекламных кампаний, это могут быть данные о показах, кликах, конверсиях и стоимости.

data = np.array([
    ['Ключевое слово', 'Показы', 'Клики', 'CTR'],
    ['купить телефон', 1000, 100, 0.1],
    ['заказать смартфон', 800, 80, 0.1],
    ['цена мобильный', 600, 60, 0.1]
])

Создание таблицы с помощью plt.table() или ax.table()

Для создания таблицы используется функция ax.table(). Необходимо указать положение таблицы на осях, данные и другие параметры.

fig, ax = plt.subplots()
ax.axis('off') # Отключаем оси координат
table = ax.table(cellText=data[1:, :], colLabels=data[0, :], loc='center')

Настройка отображения таблицы (шрифт, размер ячеек, границы)

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

table.auto_set_font_size(False)
table.set_fontsize(12)
table.scale(1.2, 1.2) # увеличение размера таблицы

Изменение цвета ячеек таблицы на основе значений

Определение пороговых значений для цветовой градации

Для раскрашивания ячеек на основе значений необходимо определить пороговые значения, которые будут определять цвет ячейки. Например, можно выделить ячейки с CTR выше определенного значения зеленым цветом, а ниже – красным.

Создание функции для выбора цвета ячейки в зависимости от значения

Создадим функцию, которая будет возвращать цвет ячейки в зависимости от ее значения.

def color_cell(value: float, threshold: float) -> str:
    """Возвращает цвет ячейки в зависимости от значения.

    Args:
        value: Значение ячейки.
        threshold: Пороговое значение.

    Returns:
        Цвет ячейки (строка).
    """
    if isinstance(value, str): # Skip header row
        return 'white'
    if float(value) > threshold:
        return 'lightgreen'
    else:
        return 'lightcoral'

Применение функции к каждой ячейке таблицы

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

threshold_ctr = 0.09 # Пороговое значение CTR

for i in range(1, data.shape[0]): # Skip header row
    for j in range(data.shape[1]):
        cell = table.get_celld()[(i, j)]
        cell.set_facecolor(color_cell(data[i, j], threshold_ctr))

Использование colormaps для автоматического градиента цветов

Для автоматического создания градиента цветов можно использовать colormaps. Это позволяет более плавно отображать изменение значений.

Реклама
import matplotlib.cm as cm
import matplotlib.colors as mcolors

def color_cell_cmap(value: float, min_value: float, max_value: float, cmap_name: str = 'RdYlGn') -> str:
    """Возвращает цвет ячейки на основе colormap.

    Args:
        value: Значение ячейки.
        min_value: Минимальное значение.
        max_value: Максимальное значение.
        cmap_name: Название colormap.

    Returns:
        Цвет ячейки (строка).
    """
    if isinstance(value, str):  # Skip header row
        return 'white'
    cmap = cm.get_cmap(cmap_name)
    norm = mcolors.Normalize(vmin=min_value, vmax=max_value)
    color = cmap(norm(float(value)))
    return mcolors.to_hex(color)

# example usage
min_ctr = 0.05
max_ctr = 0.11

for i in range(1, data.shape[0]):
    for j in range(data.shape[1]):
        if j == 3: # CTR column
            cell = table.get_celld()[(i, j)]
            cell.set_facecolor(color_cell_cmap(data[i, j], min_ctr, max_ctr))

Примеры раскрашивания ячеек таблиц в Matplotlib

Пример 1: Раскрашивание ячеек на основе положительных и отрицательных значений

В этом примере раскрасим ячейки с положительными значениями зеленым цветом, а с отрицательными – красным.

data_example = np.array([
    ['Показатель', 'Значение'],
    ['Прибыль', 1000],
    ['Убыток', -500],
    ['Доход', 2000]
])

def color_positive_negative(value: float) -> str:
    """Возвращает цвет для положительных и отрицательных значений.

    Args:
        value: Значение.

    Returns:
        Цвет (строка).
    """
    if isinstance(value, str):
        return 'white'
    if float(value) > 0:
        return 'lightgreen'
    else:
        return 'lightcoral'

fig, ax = plt.subplots()
ax.axis('off')
table = ax.table(cellText=data_example[1:, :], colLabels=data_example[0, :], loc='center')

for i in range(1, data_example.shape[0]):
    cell = table.get_celld()[(i, 1)]
    cell.set_facecolor(color_positive_negative(data_example[i, 1]))

plt.show()

Пример 2: Использование нескольких порогов для более сложной цветовой схемы

В этом примере используем несколько пороговых значений для создания более сложной цветовой схемы.

def color_by_thresholds(value: float) -> str:
    """Возвращает цвет в зависимости от нескольких порогов.

    Args:
        value: Значение.

    Returns:
        Цвет (строка).
    """
    if isinstance(value, str):
        return 'white'
    value = float(value)
    if value > 1500:
        return 'green'
    elif value > 500:
        return 'yellow'
    else:
        return 'red'

Пример 3: Применение colormap к числовым значениям

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

Продвинутые техники и советы

Использование cellColours для раскрашивания ячеек при создании таблицы

При создании таблицы можно сразу указать цвета ячеек с помощью параметра cellColours.

cell_colors = [['lightgrey', 'lightgrey'], ['lightgreen', 'lightcoral'], ['lightcoral', 'lightgreen']] # пример цветов

fig, ax = plt.subplots()
ax.axis('off')
table = ax.table(cellText=data_example[1:, :], colLabels=data_example[0, :], cellColours=cell_colors[:data_example.shape[0]-1], loc='center')

plt.show()

Обработка исключений и ошибок при раскрашивании ячеек

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

Оптимизация производительности при работе с большими таблицами

При работе с большими таблицами раскрашивание каждой ячейки может занять значительное время. Для оптимизации можно использовать векторизацию операций numpy, если это возможно, или применять раскрашивание только к тем ячейкам, которые необходимо выделить.

Интеграция раскрашивания таблиц с другими функциями Matplotlib

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


Добавить комментарий