Линейные графики Matplotlib в Python — Полное руководство
Создание и настройка линейных графиков в Python с Matplotlib: цвета, стили, маркеры, несколько линий, аннотации и сохранение.
Функция plot() в Matplotlib — основной инструмент для построения линейных графиков, которые соединяют точки данных непрерывной линией и показывают тенденции во времени или по непрерывной переменной. В этой главе рассматривается всё: от первого графика синусоиды до профессиональных приёмов — аннотаций, закрашенных областей и сохранения файлов, готовых к публикации.
Перед началом работы убедитесь, что Matplotlib установлен:
pip install matplotlibЕсли вы только начинаете знакомиться с библиотекой, сначала прочитайте главы Matplotlib Introduction и Getting Started.
Когда использовать линейный график
Используйте линейный график, когда:
- Нужно показать тенденции во времени (цены акций, температура по месяцам, потери при обучении по эпохам).
- Ось x представляет непрерывную или упорядоченную переменную (время, расстояние, частота).
- Требуется сравнить несколько рядов данных с общей осью x.
Не используйте линейные графики для неупорядоченных категорий — там нагляднее будет столбчатая диаграмма. Для отображения связи между двумя независимыми числовыми переменными без подразумеваемого порядка рассмотрите диаграмму рассеяния.
Создание базового линейного графика
Минимальный синтаксис — plt.plot(x, y). Оба аргумента x и y могут быть списками Python или массивами NumPy.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100) # 100 evenly-spaced points from 0 to 10
y = np.sin(x)
plt.plot(x, y)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Sine Wave')
plt.tight_layout()
plt.show()np.linspace(start, stop, num) возвращает num равномерно распределённых значений — удобный способ генерировать плавные кривые без написания цикла. plt.tight_layout() корректирует отступы, чтобы подписи осей не обрезались; рекомендуется вызывать эту функцию перед каждым show() или savefig().
Изменение цвета и стиля линии
Использование сокращённой строки формата
Передайте строку формата '[color][marker][linestyle]' в качестве третьего позиционного аргумента:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, 'r--') # red dashed line
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Red Dashed Sine Wave')
plt.tight_layout()
plt.show()Часто используемые обозначения цветов: b — синий, g — зелёный, r — красный, c — голубой, m — пурпурный, y — жёлтый, k — чёрный, w — белый.
Часто используемые коды стилей линий: - — сплошная (по умолчанию), -- — штриховая, -. — штрихпунктирная, : — пунктирная.
Использование именованных параметров
Именованные параметры читаются лучше и дают более тонкий контроль:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(
x, y,
color='steelblue',
linestyle='--',
linewidth=2,
)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Styled Line')
plt.tight_layout()
plt.show()| Параметр | Что управляет | Примеры значений |
|---|---|---|
color | Цвет линии | 'red', '#3498db', (0.2, 0.6, 0.8) |
linestyle | Паттерн штрихов | '-', '--', '-.', ':' |
linewidth | Толщина в пунктах | 1 (по умолчанию), 2, 3 |
alpha | Прозрачность 0–1 | 0.5 для 50% непрозрачности |
Добавление маркеров к точкам данных
Маркеры рисуют символ в каждой точке данных — это полезно, когда исходных данных мало и вы хотите показать их явно.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 9) # only 9 points — markers are visible
y = np.sin(x)
plt.plot(
x, y,
color='darkorange',
linewidth=1.5,
marker='o', # circle marker
markersize=8,
markerfacecolor='white',
markeredgewidth=1.5,
)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave with Markers')
plt.tight_layout()
plt.show()Часто используемые коды маркеров: 'o' — круг, 's' — квадрат, '^' — треугольник вверх, 'D' — ромб, '+' — плюс, 'x' — крест, '*' — звезда.
Полный список и расширенные параметры форматирования см. в главе Matplotlib Markers.
Построение нескольких линий
Вызовите plt.plot() несколько раз перед plt.show(). Каждый вызов добавляет новую линию на те же оси. Передайте аргумент label и вызовите plt.legend(), чтобы легенда создалась автоматически.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.exp(-x / 5) # damped sine
plt.plot(x, y1, label='sin(x)', linewidth=1.5)
plt.plot(x, y2, label='cos(x)', linewidth=1.5, linestyle='--')
plt.plot(x, y3, label='damped sin(x)', linewidth=1.5, linestyle='-.')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Multiple Lines')
plt.legend()
plt.tight_layout()
plt.show()Matplotlib автоматически перебирает цвета из стандартной палитры, поэтому задавать разные цвета для каждой линии не нужно — только если вы хотите их переопределить.
Управление границами осей
plt.xlim() и plt.ylim() задают видимый диапазон каждой оси. Передайте (min, max) для увеличения или уменьшения масштаба:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y)
plt.xlim(0, 5) # show only the first half
plt.ylim(-1.2, 1.2)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave (Zoomed In)')
plt.tight_layout()
plt.show()Чтобы позволить Matplotlib определить одну границу автоматически, зафиксировав другую, используйте None в качестве заглушки: plt.xlim(None, 5) оставляет нижнюю границу автоматической.
Добавление сетки
plt.grid(True) добавляет лёгкую сетку, которая упрощает считывание значений с графика. Можно применить сетку только к основным или вспомогательным делениям и управлять её стилем:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y, color='steelblue', linewidth=2)
plt.grid(True, linestyle='--', color='grey', alpha=0.5)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave with Grid')
plt.tight_layout()
plt.show()Полное описание настройки сетки см. в главе Matplotlib Grid.
Аннотирование точек
plt.annotate() рисует текстовую метку с необязательной стрелкой, указывающей на конкретную точку данных. Это полезно для обозначения пиков, впадин или значимых событий.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y, color='steelblue', linewidth=1.5)
# Annotate the first peak (approx. x = pi/2)
plt.annotate(
'peak',
xy=(np.pi / 2, 1), # point to annotate
xytext=(np.pi / 2 + 1, 1.1), # position of the text
arrowprops=dict(arrowstyle='->', color='black'),
fontsize=10,
)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Annotated Sine Wave')
plt.tight_layout()
plt.show()Заливка между линиями
plt.fill_between() закрашивает область между двумя кривыми (или между кривой и константой). Это часто используется для отображения доверительных интервалов или полос неопределённости.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
# Simulate an upper and lower confidence bound
upper = y + 0.3
lower = y - 0.3
plt.plot(x, y, color='steelblue', linewidth=2, label='mean')
plt.fill_between(x, lower, upper, alpha=0.2, color='steelblue', label='±0.3 band')
plt.xlabel('x')
plt.ylabel('Amplitude')
plt.title('Line with Confidence Band')
plt.legend()
plt.tight_layout()
plt.show()Аргумент alpha управляет прозрачностью заливки — значения около 0.2–0.3 обычно хорошо работают, так как линия остаётся отчётливо видимой.
Использование объектно-ориентированного API
Все приведённые выше примеры используют интерфейс plt.* без сохранения состояния, что удобно для однооконных скриптов. Для более сложных фигур (несколько подграфиков, вложенные графики) используйте объектно-ориентированный API, работая с явными объектами Figure и Axes:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(x, y1, label='sin(x)', color='steelblue', linewidth=1.5)
ax.plot(x, y2, label='cos(x)', color='darkorange', linewidth=1.5, linestyle='--')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('OO-style Line Plot')
ax.legend()
ax.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.show()В объектно-ориентированном API вызовы plt.* заменяются на ax.set_* для меток и заголовков. Это предпочтительный стиль, когда нужно размещать несколько графиков — подробнее см. в главе Matplotlib Subplots.
Сохранение линейного графика в файл
Используйте plt.savefig() до plt.show(). Формат файла задаётся через расширение:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
plt.plot(x, y, color='steelblue', linewidth=2)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Saved Line Plot')
plt.tight_layout()
plt.savefig('sine_wave.png', dpi=150) # raster PNG at 150 dpi
plt.savefig('sine_wave.svg') # vector SVG (ideal for web/print)
plt.show()Поддерживаемые форматы: png, pdf, svg, eps. Используйте svg или pdf, когда нужно масштабируемое изображение, готовое для печати. Вызывайте savefig() до show() — после show() фигура очищается и savefig() создаст пустое изображение.
Управление размером фигуры
По умолчанию фигура имеет размер 6,4 × 4,8 дюйма при 100 dpi. Измените его с помощью figsize=(width_in, height_in):
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
fig, ax = plt.subplots(figsize=(10, 4)) # wide and short
ax.plot(x, np.sin(x), label='sin', linewidth=1.5)
ax.plot(x, np.cos(x), label='cos', linewidth=1.5, linestyle='--')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Wide Figure')
ax.legend()
plt.tight_layout()
plt.show()Краткий справочник
| Задача | Код |
|---|---|
| Базовый линейный график | plt.plot(x, y) |
| Красная штриховая линия (сокращённо) | plt.plot(x, y, 'r--') |
| Именованные параметры стиля | plt.plot(x, y, color='steelblue', linestyle='--', linewidth=2) |
| Добавить маркеры | plt.plot(x, y, marker='o', markersize=6) |
| Несколько линий с легендой | вызвать plt.plot() дважды; plt.legend() |
| Задать границы осей | plt.xlim(0, 5) / plt.ylim(-1, 1) |
| Добавить сетку | plt.grid(True, linestyle='--', alpha=0.5) |
| Аннотировать точку | plt.annotate('text', xy=(x0, y0), xytext=(xt, yt), arrowprops={...}) |
| Закрасить область между кривыми | plt.fill_between(x, y_lower, y_upper, alpha=0.2) |
| Сохранить в файл | plt.savefig('file.png', dpi=150) |
| Задать размер фигуры | plt.subplots(figsize=(10, 4)) |
Связанные главы
- Matplotlib Introduction — обзор библиотеки и установка
- Matplotlib Pyplot — интерфейс
pyplotподробно - Matplotlib Markers — формы маркеров и форматирование
- Matplotlib Labels — подписи осей, заголовки и аннотации
- Matplotlib Grid — добавление и стилизация линий сетки
- Matplotlib Scatter Plots — связи между двумя переменными
- Matplotlib Bar Charts — сравнение величин по категориям
- Matplotlib Subplots — несколько графиков в одной фигуре