Создание и аннотация точек на scatter plot в Matplotlib
Быстрый ответ
Для создания и аннотирования точечного графика потребуются лишь несколько шагов. Воспользуйтесь следующим кодом:
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() # Отображаем график
Вот и все, ваш аннотированный точечный график готов.
Оформление аннотаций
Метки могут содержать ценнейшую информацию, они не всегда являются простыми идентификаторами. Matplotlib предоставляет возможность оформить метки привлекательно:
for x_coord, y_coord, label in zip(x, y, labels):
plt.text(x_coord, y_coord, label,
fontsize=9, color='purple', ha='right') # Улучшаем представление
Таким образом метки становятся не только информативными, но и стильными!
Решение проблемы перекрытия меток
Если точки данных расположены очень близко, их метки могут накладываться. Чтобы избежать этого, можно отодвинуть метки от точек с помощью следующего кода:
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'))
Благодаря этому подходу метки становятся четко видимыми и не перекрывают друг друга.
Несколько графиков на одной картинке
Если требуется сопоставить несколько графиков, то отлично подойдут субграфики:
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-точечные графики для добавления еще одного измерения:
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-представление придаёт данным больше ясности и красочности.
Визуализация
Создание точечного графика можно сравнить с организацией праздника, где каждый гость (точка данных) получает свой уникальный значок.
Место проведения: 🕺💃🕺
Гости: 😎🤓🥸
Значки: 🎗
plt.scatter(x, y) # Начинаем празднование
for i, badge in enumerate(badges):
plt.text(x[i], y[i], badge) # Вручаем значки гостям
Так каждая точка данных обретает свое уникальное значение:
До: 😎 🤓 🥸
После: 🎗😎 🎗🤓 🎗🥸
Теперь каждая точка данных не только видна, но и имеет свой уникальный знак.
Функционализация размещения меток данных
Если вы планируете использовать стиль оформления точечных графиков в других проектах, стоит создать функцию для автоматизации процесса:
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())
Данная функция обеспечит правильную аннотацию каждой точки независимо от набора данных.
Повышенное форматирование аннотаций
Хотите, чтобы ваш точечный график был более выразительным? Добавьте стиль в аннотации:
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'))
Эти усовершенствования преобразуют обычный график в произведение искусства, которое привлечет внимание и запомнится.
Полезные материалы
- matplotlib.pyplot.scatter — документация Matplotlib 3.1.2 — основа для создания точечных графиков в Matplotlib.
- Простые Точечные Графики | Руководство по науке о данных на Python — пошаговое руководство по созданию точечных графиков.
- Управление стилем текста и меток при помощи словаря — документация Matplotlib 3.1.0 — руководство по стилизации текста и меток на графиках.
- Добавление текстовой аннотации на точечной диаграмме — примеры аннотаций текстом для точечных графиков.
- Урок Matplotlib 2 – Легенды, заголовки и метки – YouTube — видеоурок по использованию легенд, заголовков и меток в Matplotlib.