Создание и аннотация точек на scatter plot в Matplotlib

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

Python
Скопировать код
import matplotlib.pyplot as plt

x, y = [1, 2, 3, 4], [10, 15, 20, 25]  # Координаты точек
labels = ['A', 'B', 'C', 'D']  # Метки точек

plt.scatter(x, y)  # Создаем точечный график
# Добавляем текстовые метки к каждой точке
for x_coord, y_coord, label in zip(x, y, labels):
    plt.text(x_coord, y_coord, label)  

plt.show()  # Отображаем график

Вот и все, ваш аннотированный точечный график готов.

Кинга Идем в IT: пошаговый план для смены профессии

Оформление аннотаций

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

Python
Скопировать код
for x_coord, y_coord, label in zip(x, y, labels):
    plt.text(x_coord, y_coord, label,
             fontsize=9, color='purple', ha='right')  # Улучшаем представление

Таким образом метки становятся не только информативными, но и стильными!

Решение проблемы перекрытия меток

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

Python
Скопировать код
for i, label in enumerate(labels):
    plt.annotate(label, (x[i], y[i]), textcoords='offset points',
                 xytext=(5, 5), ha='left', va='bottom', 
                 arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0'))

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

Несколько графиков на одной картинке

Если требуется сопоставить несколько графиков, то отлично подойдут субграфики:

Python
Скопировать код
fig, axs = plt.subplots(2)  # Создаем два субграфика
axs[0].scatter(x, y)  # Первый субграфик
axs[1].scatter(y, x)  # Второй субграфик, с перевернутыми осями

labels_sub1 = [f'{lab}_1' for lab in labels]  # Первый набор меток
labels_sub2 = [f'{lab}_2' for lab in labels]  # Второй набор меток

# Аннотируем оба субграфика
for i, (lab1, lab2) in enumerate(zip(labels_sub1, labels_sub2)):
    axs[0].annotate(lab1, (x[i], y[i]))
    axs[1].annotate(lab2, (y[i], x[i]))

plt.show()  # Покажем результат

Так вы можете сравнивать графики на одной картинке.

Погружение в 3D: точечные графики

Если данные требуют трехмерного представления, используйте 3D-точечные графики для добавления еще одного измерения:

Python
Скопировать код
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Определите трехмерные координаты точек
x_3d, y_3d, z_3d = [1, 2, 3, 4], [10, 15, 20, 25], [5, 6, 7, 8]  
labels_3d = ['A1', 'B1', 'C1', 'D1']  # Метки для 3D графика

ax.scatter(x_3d, y_3d, z_3d)  # Строим 3D график

# Добавляем метки на график
for xyz, label in zip(zip(x_3d, y_3d, z_3d), labels_3d):
    ax.text(*xyz, label)

plt.show()  # Отображаем график

Такое 3D-представление придаёт данным больше ясности и красочности.

Визуализация

Создание точечного графика можно сравнить с организацией праздника, где каждый гость (точка данных) получает свой уникальный значок.

Место проведения: 🕺💃🕺
Гости: 😎🤓🥸
Значки: 🎗
Python
Скопировать код
plt.scatter(x, y)  # Начинаем празднование
for i, badge in enumerate(badges):
    plt.text(x[i], y[i], badge)  # Вручаем значки гостям

Так каждая точка данных обретает свое уникальное значение:

Markdown
Скопировать код
До:  😎  🤓  🥸
После:  🎗😎  🎗🤓  🎗🥸

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

Функционализация размещения меток данных

Если вы планируете использовать стиль оформления точечных графиков в других проектах, стоит создать функцию для автоматизации процесса:

Python
Скопировать код
def annotate_scatter(x_data, y_data, labels, ax):
    # Связываем каждую точку с ее меткой
    for x_coord, y_coord, label in zip(x_data, y_data, labels):
        ax.text(x_coord, y_coord, label)

# Применяем функцию к текущему набору данных и текущей системе координат
annotate_scatter(x, y, labels, plt.gca())

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

Повышенное форматирование аннотаций

Хотите, чтобы ваш точечный график был более выразительным? Добавьте стиль в аннотации:

Python
Скопировать код
for i, label in enumerate(labels):
    plt.annotate(label, (x[i], y[i]), xytext=(-15, 10), 
                 textcoords='offset points', ha='center', 
                 bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
                 arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.5', color='red'))

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

Полезные материалы

  1. matplotlib.pyplot.scatter — документация Matplotlib 3.1.2 — основа для создания точечных графиков в Matplotlib.
  2. Простые Точечные Графики | Руководство по науке о данных на Python — пошаговое руководство по созданию точечных графиков.
  3. Управление стилем текста и меток при помощи словаря — документация Matplotlib 3.1.0 — руководство по стилизации текста и меток на графиках.
  4. Добавление текстовой аннотации на точечной диаграмме — примеры аннотаций текстом для точечных графиков.
  5. Урок Matplotlib 2 – Легенды, заголовки и метки – YouTube — видеоурок по использованию легенд, заголовков и меток в Matplotlib.