Маркеры Matplotlib
Как использовать и настраивать маркеры Matplotlib в Python. Стили, размер, цвет, заливка и индивидуальное управление маркерами.
Маркеры — это символы, которые Matplotlib рисует в каждой точке данных на графике. Правильный выбор стиля маркера, а также умение изменять его размер, цвет и заливку позволяют превратить перегруженную диаграмму в понятную и информативную. На этой странице рассмотрены все доступные в Matplotlib стили маркеров, способы настройки их внешнего вида, а также случаи, когда лучше использовать plot(), а когда scatter() для индивидуального управления каждой точкой.
Что такое маркер в Matplotlib?
Маркер — это фигура, отображаемая в каждой точке (x, y) на графике. Форму фигуры задают параметром marker (или как часть строки формата). Маркеры независимы от линии, соединяющей точки данных: можно показать одно без другого.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 5, 3, 7, 4]
# Line with markers
plt.plot(x, y, marker='o')
# Markers only — no connecting line
plt.plot(x, y, marker='s', linestyle='None')
plt.show()Все встроенные стили маркеров
Matplotlib поставляется с более чем 30 встроенными кодами маркеров. В таблице ниже перечислены наиболее часто используемые из них.
| Код маркера | Форма |
|---|---|
'o' | Круг |
's' | Квадрат |
'D' | Ромб |
'd' | Тонкий ромб |
'^' | Треугольник (вверх) |
'v' | Треугольник (вниз) |
'<' | Треугольник (влево) |
'>' | Треугольник (вправо) |
'p' | Пятиугольник |
'h' | Шестиугольник 1 |
'H' | Шестиугольник 2 |
'8' | Восьмиугольник |
'*' | Звезда |
'+' | Плюс |
'x' | Крест |
'X' | Заполненный крест |
| `' | '` |
'_' | Горизонтальная линия |
'.' | Точка (маленький кружок) |
',' | Пиксель |
'1' | Три-вниз |
'2' | Три-вверх |
'3' | Три-влево |
'4' | Три-вправо |
'None' или '' | Без маркера |
Чтобы увидеть все маркеры сразу, можно перебрать matplotlib.markers.MarkerStyle.markers:
import matplotlib.pyplot as plt
import matplotlib.markers as mmarkers
print(list(mmarkers.MarkerStyle.markers.keys()))Использование маркеров в линейном графике
Функция plot() принимает аргумент marker. Он применяет одинаковый маркер ко всем точкам данных.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 15, 25, 30]
plt.plot(x, y, marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Line plot with circle markers')
plt.show()Использование строки формата
Вместо отдельных именованных аргументов можно объединить стиль линии, цвет и маркер в одну строку формата: '[цвет][маркер][стиль линии]'.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 15, 25, 30]
# Red circles connected by a dashed line
plt.plot(x, y, 'ro--')
plt.title('Format string: red circles, dashed line')
plt.show()Распространённые компоненты строки формата:
| Цвет | Маркер | Стиль линии |
|---|---|---|
'r' красный | 'o' круг | '-' сплошная |
'g' зелёный | 's' квадрат | '--' пунктирная |
'b' синий | '^' треугольник | ':' точечная |
'k' чёрный | '*' звезда | '-.' штрихпунктирная |
'm' пурпурный | '+' плюс | 'None' без линии |
Настройка внешнего вида маркеров
Matplotlib предоставляет четыре именованных аргумента для тонкой настройки маркеров:
| Параметр | Что управляет |
|---|---|
markersize (или ms) | Диаметр маркера в пунктах |
markerfacecolor (или mfc) | Цвет заливки маркера |
markeredgecolor (или mec) | Цвет границы маркера |
markeredgewidth (или mew) | Ширина границы маркера в пунктах |
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 15, 25, 30]
plt.plot(
x, y,
marker='o',
markersize=12,
markerfacecolor='gold',
markeredgecolor='navy',
markeredgewidth=2,
)
plt.title('Customized circle markers')
plt.show()Полые маркеры
Задайте markerfacecolor='none' (строка в нижнем регистре), чтобы рисовать только границу, создавая полый маркер:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [3, 1, 4, 1, 5]
plt.plot(x, y, marker='s', markersize=14, markerfacecolor='none', markeredgecolor='steelblue', markeredgewidth=2)
plt.title('Hollow square markers')
plt.show()Стиль заливки
Параметр fillstyle управляет тем, какая часть маркера заполняется. Допустимые значения: 'full', 'left', 'right', 'bottom', 'top' и 'none'.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 3, 5, 1]
plt.plot(x, y, marker='o', markersize=16, fillstyle='left', markerfacecolor='crimson', markeredgecolor='black')
plt.title('Half-filled circle markers (fillstyle="left")')
plt.show()Индивидуальное управление маркерами с помощью scatter()
plot() применяет одинаковый маркер ко всей линии. Если каждая точка должна иметь разный размер или цвет — например, для отображения третьей переменной — используйте scatter().
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 15, 25, 30]
sizes = [40, 100, 200, 80, 160] # area in points²
colors = [0.2, 0.5, 0.8, 0.3, 0.9] # mapped through colormap
sc = plt.scatter(x, y, s=sizes, c=colors, cmap='plasma', edgecolors='black')
plt.colorbar(sc, label='Value')
plt.title('Per-point size and color with scatter()')
plt.show()Ключевые различия между plot() и scatter() для маркеров:
| Возможность | plot() | scatter() |
|---|---|---|
| Форма маркера | Одинакова для всех точек | Одинакова для всех точек |
| Размер маркера | Единый | Для каждой точки (array s) |
| Цвет маркера | Единый | Для каждой точки (array c + цветовая карта) |
| Производительность на больших данных | Быстрее | Медленнее |
Несколько серий данных с разными маркерами
Используйте отдельные вызовы plot(), чтобы назначить уникальный маркер каждой серии, затем добавьте легенду:
import matplotlib.pyplot as plt
months = [1, 2, 3, 4, 5, 6]
product_a = [120, 135, 110, 150, 140, 160]
product_b = [80, 95, 100, 90, 115, 130]
product_c = [60, 70, 65, 85, 90, 95]
plt.plot(months, product_a, marker='o', label='Product A')
plt.plot(months, product_b, marker='s', label='Product B')
plt.plot(months, product_c, marker='^', label='Product C')
plt.xlabel('Month')
plt.ylabel('Units sold')
plt.title('Monthly sales by product')
plt.legend()
plt.show()Маркеры без соединяющей линии
Передача linestyle='None' (или ls='None') убирает линию и оставляет только маркеры — фактически это точечный график, построенный с помощью plot().
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = [3, 1, 4, 1, 5, 9, 2, 6]
plt.plot(x, y, marker='D', linestyle='None', color='darkorange', markersize=10)
plt.title('Diamond markers, no line')
plt.show()Этот подход удобен, когда порядок точек данных важен (сохраняется исходный порядок x), но линия, намекающая на непрерывную тенденцию, нежелательна.
Практические советы
- Подбирайте маркер под плотность данных. При построении тысяч точек используйте мелкие маркеры (
'.'или','); для небольшого числа измерений подойдут крупные формы ('o','s'). - Следите за контрастностью. На белом фоне тёмный
markeredgecolorна светломmarkerfacecolorделает каждую точку хорошо различимой даже при малом размере. - Не перегружайте один график. Более пяти различных форм маркеров на одной диаграмме делают легенду трудночитаемой — рассмотрите использование подграфиков или различных цветов.
- Используйте
scatter()для кодирования третьей переменной. Arrays размеров или цветов, отображённые через цветовую карту, передают дополнительное измерение, не добавляя новые серии в легенду.
Связанные темы
- Линейные графики Matplotlib — настройка стиля линии вместе с маркерами
- Точечный график Matplotlib — индивидуальное управление размером и цветом точек
- Подписи Matplotlib — добавление подписей осей и заголовков к графикам
- Обзор построения графиков Matplotlib — знакомство со всеми основными типами графиков