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

Что такое составная столбчатая диаграмма и когда ее использовать?

Составная столбчатая диаграмма (stacked bar chart) — это визуализация данных, в которой столбцы, представляющие различные категории, разделены на подсекции, соответствующие подкатегориям. Каждая подсекция показывает вклад этой подкатегории в общую величину категории. Использовать составные диаграммы целесообразно, когда необходимо визуализировать как общие значения категорий, так и их компонентный состав. Например, сравнение продаж различных продуктов по регионам, где каждый столбец представляет продукт, а подсекции — регионы, показывает общие продажи продукта и вклад каждого региона.

Необходимость добавления значений на столбцы: улучшение читаемости и анализа

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

Подготовка данных для составной столбчатой диаграммы

Форматирование данных для эффективного представления

Данные для составной столбчатой диаграммы обычно представляются в виде двумерного массива или DataFrame, где строки соответствуют категориям, а столбцы — подкатегориям. Важно, чтобы данные были структурированы таким образом, чтобы Matplotlib мог правильно интерпретировать их при создании диаграммы. Для удобства часто используют библиотеки, такие как Pandas.

Пример данных для демонстрации: сравнение категорий и подкатегорий

Предположим, у нас есть данные о продажах трех продуктов (A, B, C) в двух регионах (Север, Юг):

import pandas as pd
import matplotlib.pyplot as plt
from typing import Dict, List

data: Dict[str, List[int]] = {
    'Север': [20, 30, 40],
    'Юг': [30, 25, 35]
}

index: List[str] = ['A', 'B', 'C']
df: pd.DataFrame = pd.DataFrame(data, index=index)
print(df)

Этот DataFrame будет использоваться для создания составной столбчатой диаграммы.

Добавление значений на столбцы с использованием matplotlib.pyplot.text

Базовый синтаксис функции text()

Функция matplotlib.pyplot.text() добавляет текст в указанные координаты на графике. Базовый синтаксис:

plt.text(x, y, text, ha='center', va='bottom', color='black')

Где:

  • x, y: Координаты текста.
  • text: Отображаемый текст.
  • ha: Горизонтальное выравнивание (‘center’, ‘left’, ‘right’).
  • va: Вертикальное выравнивание (‘bottom’, ‘top’, ‘center’).
  • color: Цвет текста.

Вычисление позиции текста на столбце: учет высоты столбца и выравнивание

Для добавления текста на столбцы необходимо вычислить координаты x и y для каждой подсекции. x координата обычно является центром столбца, а y координата – суммой высот предыдущих подсекций плюс половина высоты текущей. Выравнивание ha='center' и va='bottom' обеспечивают центрирование текста относительно вычисленной позиции.

Пример кода: добавление значений в простую составную столбчатую диаграмму

import pandas as pd
import matplotlib.pyplot as plt
from typing import Dict, List


def create_stacked_bar_chart_with_values(data: Dict[str, List[int]], index: List[str], title: str) -> None:
    """Creates a stacked bar chart with values on each segment."""
    df: pd.DataFrame = pd.DataFrame(data, index=index)

    fig, ax = plt.subplots()

    bottom = [0] * len(index)

    for region in df.columns:
        ax.bar(index, df[region], bottom=bottom, label=region)

        for i, value in enumerate(df[region]):
            ax.text(index[i], bottom[i] + value / 2, str(value), ha='center', color='white')

        bottom = [bottom[i] + df[region][i] for i in range(len(index))]

    ax.set_title(title)
    ax.legend()
    plt.show()


data: Dict[str, List[int]] = {
    'Север': [20, 30, 40],
    'Юг': [30, 25, 35]
}

index: List[str] = ['A', 'B', 'C']
create_stacked_bar_chart_with_values(data, index, "Продажи по регионам")

Настройка внешнего вида текста: цвет, размер, шрифт

Внешний вид текста можно настроить с помощью параметров функции text():

Реклама
  • color: Цвет текста (например, 'white', 'black', 'red').
  • fontsize: Размер шрифта (например, 8, 10, 12).
  • fontweight: Толщина шрифта (например, 'bold', 'normal').
  • fontfamily: Семейство шрифтов (например, 'Arial', 'sans-serif').

Пример:

ax.text(x, y, str(value), ha='center', color='black', fontsize=8, fontweight='bold')

Добавление значений на составную столбчатую диаграмму с группами

Проблема перекрытия текста и способы ее решения

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

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

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

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

Корректировка позиции текста для групп: пример кода

import pandas as pd
import matplotlib.pyplot as plt
from typing import Dict, List


def create_grouped_stacked_bar_chart_with_values(data: Dict[str, Dict[str, int]], title: str) -> None:
    """Creates a grouped stacked bar chart with values on each segment."""
    categories: List[str] = list(data.keys())
    subcategories: List[str] = list(data[categories[0]].keys())

    fig, ax = plt.subplots()

    width: float = 0.2  # the width of the bars
    x = [i for i in range(len(categories))]

    for i, subcategory in enumerate(subcategories):
        values = [data[category][subcategory] for category in categories]

        # Calculate the x positions for the bars, offsetting each group
        x_pos = [pos + i * width for pos in x]

        ax.bar(x_pos, values, width, label=subcategory)

        for j, value in enumerate(values):
            ax.text(x_pos[j], value, str(value), ha='center', va='bottom')

    ax.set_xticks([pos + width * (len(subcategories) - 1) / 2 for pos in x]) # Centralize xtick labels
    ax.set_xticklabels(categories)
    ax.set_title(title)
    ax.legend()
    plt.tight_layout()
    plt.show()


data: Dict[str, Dict[str, int]] = {
    'Продукт A': {'Север': 20, 'Юг': 30},
    'Продукт B': {'Север': 30, 'Юг': 25},
    'Продукт C': {'Север': 40, 'Юг': 35}
}

create_grouped_stacked_bar_chart_with_values(data, "Продажи по продуктам и регионам")

Альтернативные методы отображения значений: выноски, аннотации

Вместо непосредственного добавления текста на столбцы можно использовать выноски (callouts) или аннотации. Выноски позволяют отображать значения рядом со столбцами, соединяя их линией. Аннотации предоставляют более гибкий способ отображения дополнительной информации.

Продвинутые техники и распространенные ошибки

Обработка отрицательных значений: размещение текста под столбцом

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

y_position = bottom[i] + value / 2 if value >= 0 else bottom[i] + value / 2
va = 'bottom' if value >= 0 else 'top'
ax.text(x, y_position, str(value), ha='center', va=va)

Форматирование значений: отображение процентов, валюты и т.д.

Форматирование значений позволяет отображать их в нужном формате (проценты, валюта и т.д.). Для этого можно использовать форматированные строки:

value_str = '{:.1%}'.format(value)  # Процент с одним знаком после запятой
value_str = '${:.2f}'.format(value) # Валюта с двумя знаками после запятой
ax.text(x, y, value_str, ha='center')

Автоматическая регулировка размера текста в зависимости от высоты столбца

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

Типичные ошибки и способы их исправления

  • Перекрытие текста: Уменьшите размер шрифта, используйте другой цвет или поверните текст.
  • Неправильное позиционирование текста: Проверьте правильность вычисления координат x и y.
  • Нечитаемый текст: Выберите контрастный цвет для текста и фона.
  • Отсутствие текста: Убедитесь, что данные правильно передаются в функцию text().

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