Как добавить метки на диаграмму рассеяния в Matplotlib: полное руководство

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

Диаграмма рассеяния (scatter plot) – это тип графика, который отображает значения двух переменных в виде точек на координатной плоскости. Каждая точка представляет собой пару значений, и положение точки показывает, где эти значения находятся на осях X и Y. Диаграммы рассеяния особенно полезны для:

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

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

Зачем добавлять метки на диаграмму рассеяния

Метки на диаграмме рассеяния позволяют сделать график более информативным и понятным. Они позволяют:

  • Идентифицировать отдельные точки данных: Полезно, когда нужно выделить конкретные объекты (например, определенные рекламные кампании или отдельных студентов).
  • Предоставить дополнительную информацию: Метки могут содержать значения третьей переменной, категорию или любое другое релевантное свойство.
  • Улучшить понимание: Когда точек много, метки помогают пользователю быстрее разобраться в данных и сделать выводы.
  • Сделать презентацию более убедительной: Метки могут усилить акцент на ключевых моментах.

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

Необходимые библиотеки и подготовка данных

Для работы с диаграммами рассеяния и метками в Python нам понадобятся библиотеки matplotlib и pandas. matplotlib — основная библиотека для визуализации, а pandas — для удобной работы с данными.

import matplotlib.pyplot as plt
import pandas as pd

# Создание DataFrame с данными (пример)
data = {
    'campaign': ['A', 'B', 'C', 'D', 'E'],
    'spend': [1000, 1500, 2000, 2500, 3000],
    'clicks': [500, 800, 1200, 1500, 1800]
}
df = pd.DataFrame(data)

print(df)

Основные способы добавления меток к точкам на диаграмме

Использование функции plt.text() для добавления отдельных меток

Функция plt.text() позволяет добавлять текст в указанные координаты на графике. Мы можем использовать её в цикле, чтобы добавить метки к каждой точке на диаграмме рассеяния.

def add_labels_with_plt_text(df: pd.DataFrame):
    """Adds labels to a scatter plot using plt.text()."""
    plt.figure(figsize=(8, 6))
    plt.scatter(df['spend'], df['clicks'])
    plt.xlabel('Spend')
    plt.ylabel('Clicks')
    plt.title('Scatter plot with plt.text() labels')

    for i, txt in enumerate(df['campaign']):
        plt.text(df['spend'][i], df['clicks'][i], txt, ha='center', va='bottom')

    plt.show()

add_labels_with_plt_text(df)

В этом примере:

  • plt.scatter() создает диаграмму рассеяния.
  • Цикл for перебирает строки DataFrame.
  • plt.text() добавляет текст (значение из столбца ‘campaign’) к координатам каждой точки. ha и va задают горизонтальное и вертикальное выравнивание текста.

Автоматическое добавление меток на основе данных с использованием циклов

Предыдущий пример уже показывает, как это делается. Основная идея – итерироваться по данным и для каждой точки вызывать plt.text().

Использование аннотаций с plt.annotate()

Функция plt.annotate() более мощная, чем plt.text(). Она позволяет добавлять стрелки и настраивать связь между текстом метки и точкой на графике.

def add_annotations(df: pd.DataFrame):
    """Adds annotations to a scatter plot using plt.annotate()."""
    plt.figure(figsize=(8, 6))
    plt.scatter(df['spend'], df['clicks'])
    plt.xlabel('Spend')
    plt.ylabel('Clicks')
    plt.title('Scatter plot with plt.annotate() annotations')

    for i, txt in enumerate(df['campaign']):
        plt.annotate(
            txt,
            (df['spend'][i], df['clicks'][i]),
            xytext=(df['spend'][i] + 50, df['clicks'][i] + 50),  # Смещение текста
            arrowprops=dict(facecolor='black', shrink=0.05),
            ha='center', va='bottom'
        )

    plt.show()

add_annotations(df)

В этом примере:

  • xytext определяет положение текста метки.
  • arrowprops задает стиль стрелки, соединяющей текст с точкой.
  • shrink управляет длиной стрелки.

Настройка внешнего вида меток

Изменение шрифта, размера и цвета текста метки

def customize_labels(df: pd.DataFrame):
    """Customizes the appearance of labels in a scatter plot."""
    plt.figure(figsize=(8, 6))
    plt.scatter(df['spend'], df['clicks'])
    plt.xlabel('Spend')
    plt.ylabel('Clicks')
    plt.title('Scatter plot with customized labels')

    for i, txt in enumerate(df['campaign']):
        plt.text(
            df['spend'][i],
            df['clicks'][i],
            txt,
            ha='center',
            va='bottom',
            fontsize=12,  # Размер шрифта
            color='red',  # Цвет текста
            fontweight='bold' # Толщина шрифта
        )

    plt.show()

customize_labels(df)

Регулировка положения метки относительно точки

Как показано в примерах выше, параметры ha (horizontalalignment) и va (verticalalignment) в функциях plt.text() и plt.annotate() позволяют точно настроить положение метки относительно точки.

Добавление рамок и фона для меток

Для добавления рамки и фона можно использовать параметр bbox в функциях plt.text() и plt.annotate():

def add_bbox_to_labels(df: pd.DataFrame):
    """Adds a bounding box to labels in a scatter plot."""
    plt.figure(figsize=(8, 6))
    plt.scatter(df['spend'], df['clicks'])
    plt.xlabel('Spend')
    plt.ylabel('Clicks')
    plt.title('Scatter plot with bounding box labels')

    for i, txt in enumerate(df['campaign']):
        plt.text(
            df['spend'][i],
            df['clicks'][i],
            txt,
            ha='center',
            va='bottom',
            bbox=dict(facecolor='yellow', alpha=0.5) # Фон и прозрачность
        )

    plt.show()

add_bbox_to_labels(df)
Реклама

Управление перекрытием меток

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

  • Уменьшение размера шрифта: Сделайте метки меньше, чтобы они занимали меньше места.
  • Изменение положения меток: Попробуйте разные значения ha и va, или задайте смещение xytext в plt.annotate().
  • Использование библиотеки adjustText: Эта библиотека автоматически регулирует положение меток, чтобы избежать перекрытий. Для использования необходимо установить библиотеку: pip install adjustText. Пример:
from adjustText import adjust_text

def adjust_overlapping_labels(df: pd.DataFrame):
    """Adjusts overlapping labels in a scatter plot using adjustText."""
    plt.figure(figsize=(8, 6))
    plt.scatter(df['spend'], df['clicks'])
    plt.xlabel('Spend')
    plt.ylabel('Clicks')
    plt.title('Scatter plot with adjusted labels')

    texts = []
    for i, txt in enumerate(df['campaign']):
        t = plt.text(df['spend'][i], df['clicks'][i], txt, ha='center', va='bottom')
        texts.append(t)

    adjust_text(texts, autoalign='xy', only_move={'points':'y', 'text':'y'})

    plt.show()

adjust_overlapping_labels(df)

Продвинутые техники добавления меток

Использование условных меток (например, выделение определенных точек)

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

def conditional_labels(df: pd.DataFrame):
    """Adds labels conditionally based on a criteria."""
    plt.figure(figsize=(8, 6))
    plt.scatter(df['spend'], df['clicks'])
    plt.xlabel('Spend')
    plt.ylabel('Clicks')
    plt.title('Scatter plot with conditional labels')

    for i in range(len(df)):
        if df['clicks'][i] > 1000:
            plt.text(
                df['spend'][i],
                df['clicks'][i],
                df['campaign'][i],
                ha='center',
                va='bottom',
                color='green',  # Выделение цветом
                fontsize=12
            )

    plt.show()

conditional_labels(df)

Добавление меток на основе столбцов DataFrame

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

Интерактивные метки с использованием библиотек, таких как mpldatacursor

Библиотека mpldatacursor позволяет создавать интерактивные метки, которые появляются при наведении курсора на точку. Для использования необходимо установить библиотеку: pip install mpldatacursor.

import mpldatacursor

def interactive_labels(df: pd.DataFrame):
    """Adds interactive labels using mpldatacursor."""
    plt.figure(figsize=(8, 6))
    plt.scatter(df['spend'], df['clicks'])
    plt.xlabel('Spend')
    plt.ylabel('Clicks')
    plt.title('Scatter plot with interactive labels')

    # Создаем метки для каждой точки
    labels = [f"Campaign: {row['campaign']}\nSpend: {row['spend']}\nClicks: {row['clicks']}" for index, row in df.iterrows()]

    # Захватываем объект графика scatter
    scatter = plt.scatter(df['spend'], df['clicks'])

    # Устанавливаем аннотацию для каждой точки
    mpldatacursor.datacursor(scatter, hover=True, display='multiple', labels=labels)

    plt.show()

interactive_labels(df)

Примеры использования и лучшие практики

Пример 1: Визуализация данных о продажах с метками регионов

Предположим, у нас есть данные о продажах в разных регионах:

sales_data = {
    'region': ['North', 'South', 'East', 'West', 'Central'],
    'advertising_spend': [5000, 7000, 6000, 8000, 4000],
    'sales': [12000, 15000, 13000, 17000, 10000]
}
sales_df = pd.DataFrame(sales_data)

plt.figure(figsize=(8, 6))
plt.scatter(sales_df['advertising_spend'], sales_df['sales'])
plt.xlabel('Advertising Spend')
plt.ylabel('Sales')
plt.title('Sales vs. Advertising Spend by Region')

for i, txt in enumerate(sales_df['region']):
    plt.text(
        sales_df['advertising_spend'][i],
        sales_df['sales'][i],
        txt,
        ha='center',
        va='bottom'
    )

plt.show()

Пример 2: Анализ данных о студентах с метками успеваемости

Допустим, у нас есть данные об успеваемости студентов по двум предметам:

student_data = {
    'student_id': ['S1', 'S2', 'S3', 'S4', 'S5'],
    'math_score': [75, 80, 90, 85, 70],
    'science_score': [80, 70, 85, 90, 75]
}
student_df = pd.DataFrame(student_data)

plt.figure(figsize=(8, 6))
plt.scatter(student_df['math_score'], student_df['science_score'])
plt.xlabel('Math Score')
plt.ylabel('Science Score')
plt.title('Student Performance in Math and Science')

for i, txt in enumerate(student_df['student_id']):
    plt.text(
        student_df['math_score'][i],
        student_df['science_score'][i],
        txt,
        ha='center',
        va='bottom'
    )

plt.show()

Лучшие практики для создания понятных и информативных диаграмм рассеяния с метками

  • Используйте четкие и понятные метки: Метки должны быть краткими и отражать суть данных.
  • Избегайте перекрытия меток: Используйте adjustText или другие методы для решения этой проблемы.
  • Настраивайте внешний вид меток: Используйте разные шрифты, размеры и цвета, чтобы выделить важные точки.
  • Используйте условные метки: Выделяйте точки, представляющие особый интерес.
  • Выбирайте подходящий тип меток: plt.text() для простых меток, plt.annotate() для меток со стрелками, mpldatacursor для интерактивных меток.
  • Всегда добавляйте подписи к осям и заголовок к графику: Это необходимо для понимания того, что изображено на графике.
  • Помните о целевой аудитории: Уровень детализации и стиль оформления должны соответствовать знаниям и потребностям аудитории.

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