W3docs

Линейные графики 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–10.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.20.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))

Связанные главы

Was this page helpful?