Что такое диаграмма рассеяния и когда ее использовать
Диаграмма рассеяния (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для интерактивных меток. - Всегда добавляйте подписи к осям и заголовок к графику: Это необходимо для понимания того, что изображено на графике.
- Помните о целевой аудитории: Уровень детализации и стиль оформления должны соответствовать знаниям и потребностям аудитории.