W3docs

Python Matplotlib: Построение графиков — Полное руководство

Узнайте, как создавать и настраивать линейные графики, столбчатые диаграммы, круговые диаграммы, точечные графики и подграфики в Python с помощью Matplotlib.

Matplotlib — самая широко используемая библиотека для визуализации данных в Python. В этом руководстве объясняется, как создавать наиболее распространённые типы графиков — линейные графики, столбчатые диаграммы, круговые диаграммы, точечные графики и подграфики — и как настраивать их с помощью подписей, цветов, легенд и элементов управления разметкой. Предполагается, что вы уже установили Matplotlib и можете запускать скрипты Python локально.

Что такое построение графиков в Matplotlib?

Модуль pyplot библиотеки Matplotlib предоставляет интерфейс в стиле MATLAB, позволяющий строить графики шаг за шагом: создать фигуру, добавить данные, добавить подписи, а затем отобразить или сохранить результат. Каждый график создаётся по одной и той же схеме:

  1. Импортировать matplotlib.pyplot (обычно как plt).
  2. Вызвать функцию построения (plt.plot(), plt.bar() и т. д.) с вашими данными.
  3. Вызвать декораторные функции для добавления заголовков, подписей осей, легенд и прочего.
  4. Вызвать plt.show() для отображения фигуры или plt.savefig() для записи на диск.

Понимание этой последовательности упрощает переключение между типами графиков и объединение их в более сложные фигуры.

Установка Matplotlib

Если вы ещё не установили Matplotlib, выполните следующую команду в терминале:

pip install matplotlib

Проверьте установку, импортировав библиотеку:

import matplotlib
print(matplotlib.__version__)  # e.g. 3.9.0

Создание линейного графика

Линейный график — тип диаграммы по умолчанию, идеально подходящий для отображения тенденций во времени или любых упорядоченных последовательностей.

import matplotlib.pyplot as plt

# Data
years = [2015, 2016, 2017, 2018, 2019, 2020]
sales = [100, 150, 200, 250, 300, 350]

# Plot
plt.plot(years, sales)

# Labels and title
plt.xlabel("Year")
plt.ylabel("Sales (units)")
plt.title("Annual Sales")

plt.show()

plt.plot(x, y) рисует непрерывную линию, соединяющую каждую пару (x, y). Ось x показывает годы, а ось y — показатели продаж, что сразу же выявляет восходящую тенденцию.

Построение нескольких линий

Чтобы сравнить два набора данных на одних осях, вызовите plt.plot() дважды перед plt.show(). Используйте параметр label и функцию plt.legend() для идентификации каждой линии:

import matplotlib.pyplot as plt

years = [2018, 2019, 2020, 2021, 2022]
product_a = [120, 145, 170, 210, 260]
product_b = [90, 115, 140, 165, 195]

plt.plot(years, product_a, label="Product A")
plt.plot(years, product_b, label="Product B")

plt.xlabel("Year")
plt.ylabel("Revenue ($k)")
plt.title("Revenue by Product")
plt.legend()

plt.show()

Matplotlib автоматически назначает разные цвета каждому ряду данных. Вызов plt.legend() добавляет ключ, сопоставляющий цвета с подписями.

Создание столбчатой диаграммы

Столбчатые диаграммы сравнивают дискретные категории. Используйте plt.bar() для вертикальных столбцов и plt.barh() для горизонтальных.

import matplotlib.pyplot as plt

countries = ["USA", "China", "Japan", "Germany", "UK"]
gdp = [21.44, 14.14, 5.15, 4.17, 2.62]

plt.bar(countries, gdp, color="steelblue")

plt.xlabel("Country")
plt.ylabel("GDP (USD trillions)")
plt.title("Top 5 Economies by GDP")

plt.show()

Высота каждого столбца соответствует значению ВВП. Параметр color принимает любое именованное цветовое значение CSS, шестнадцатеричную строку или кортеж RGB.

Сгруппированные столбчатые диаграммы

Когда нужно сравнить несколько категорий рядом, вручную смещайте позиции столбцов с помощью range() и смещения ширины:

import matplotlib.pyplot as plt

categories = ["Q1", "Q2", "Q3", "Q4"]
team_a = [30, 45, 38, 52]
team_b = [25, 40, 35, 48]

x = range(len(categories))
width = 0.35

plt.bar([i - width / 2 for i in x], team_a, width=width, label="Team A")
plt.bar([i + width / 2 for i in x], team_b, width=width, label="Team B")

plt.xticks(x, categories)
plt.xlabel("Quarter")
plt.ylabel("Sales")
plt.title("Quarterly Sales by Team")
plt.legend()

plt.show()

plt.xticks(x, categories) заменяет числовые позиции меток фактическими названиями кварталов.

Создание круговой диаграммы

Круговые диаграммы показывают, как части составляют целое. Используйте их умеренно — они лучше всего работают с пятью или менее секторами, сумма которых составляет 100 %.

import matplotlib.pyplot as plt

brands = ["Samsung", "Apple", "Huawei", "Xiaomi", "Others"]
market_share = [19.2, 15.9, 14.6, 10.2, 40.1]

plt.pie(
    market_share,
    labels=brands,
    autopct="%1.1f%%",   # show percentage inside each slice
    startangle=90,       # rotate so the first slice starts at the top
)

plt.title("Smartphone Market Share")

plt.show()
  • autopct="%1.1f%%" выводит процент с одним знаком после запятой внутри каждого сектора.
  • startangle=90 поворачивает диаграмму так, чтобы первый сектор начинался в позиции 12 часов, что удобнее для чтения.

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

Создание точечного графика

Точечные графики выявляют взаимосвязь между двумя непрерывными переменными. Каждая точка представляет одно наблюдение.

import matplotlib.pyplot as plt

hours_studied = [1, 2, 3, 4, 5, 6, 7, 8]
exam_scores   = [45, 52, 60, 65, 72, 78, 85, 90]

plt.scatter(hours_studied, exam_scores, color="coral", edgecolors="black", s=80)

plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Study Time vs. Exam Score")

plt.show()

Параметр s управляет размером маркера в квадратных пунктах. edgecolors="black" добавляет контур к каждой точке, что облегчает их различение при наложении.

Для более глубокого изучения смотрите главу Точечные графики в Matplotlib.

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

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

Цвета, маркеры и стили линий

Передайте строку формата в качестве третьего аргумента функции plt.plot(), чтобы задать стиль маркера, стиль линии и цвет в один шаг:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, "ro--")   # red circles, dashed line
plt.xlabel("x")
plt.ylabel("y")
plt.title("Custom Style")
plt.show()

Строка формата "ro--" объединяет:

  • r — красный цвет
  • o — круглый маркер
  • -- — пунктирная линия

Распространённые коды строки формата:

КодЗначениеКодЗначение
bсиний-сплошная линия
gзелёный--пунктирная линия
rкрасный-.штрихпунктирная линия
kчёрный:точечная линия
oкругsквадрат
^треугольник вверх*звезда

Также можно передавать именованные аргументы для более тонкой настройки:

plt.plot(x, y, color="#2196f3", linewidth=2, linestyle="--", marker="o", markersize=8)

Размер фигуры и DPI

Задайте размеры фигуры (в дюймах) до построения графика с помощью plt.figure():

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 5), dpi=100)   # 1000×500 pixels

x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

plt.plot(x, y)
plt.title("Wide Figure")
plt.show()

figsize=(width, height) принимает значения в дюймах. dpi (точек на дюйм) управляет плотностью пикселей — 100 dpi достаточно для экрана; 300 dpi типично для печати.

Добавление сетки

Сетка облегчает считывание значений:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [3, 7, 2, 9, 4]

plt.plot(x, y, marker="o")
plt.grid(True, linestyle="--", alpha=0.7)
plt.title("Plot with Grid")
plt.show()

alpha=0.7 делает линии сетки полупрозрачными, чтобы они не перекрывали данные. Смотрите главу Сетка в Matplotlib для ознакомления с дополнительными параметрами.

Создание подграфиков

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

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 4, 9, 16, 25]
y3 = [5, 3, 7, 2, 8]
y4 = [10, 7, 4, 5, 6]

fig, axes = plt.subplots(2, 2, figsize=(10, 8))

axes[0][0].plot(x, y1, "b-o")
axes[0][0].set_title("Linear")

axes[0][1].plot(x, y2, "r--s")
axes[0][1].set_title("Quadratic")

axes[1][0].bar(x, y3, color="green")
axes[1][0].set_title("Bar Chart")

axes[1][1].scatter(x, y4, color="purple", s=80)
axes[1][1].set_title("Scatter")

plt.tight_layout()   # prevent overlapping labels
plt.show()

plt.subplots(rows, cols) возвращает объект Figure и двумерный массив объектов Axes. Работа с отдельными объектами Axes (например, axes[0][0].plot(...)) является предпочтительным подходом для многопанельных компоновок, поскольку даёт независимый контроль над каждой панелью. plt.tight_layout() автоматически регулирует отступы, чтобы заголовки и подписи не перекрывались.

Смотрите главу Подграфики в Matplotlib для ознакомления с расширенными параметрами компоновки.

Сохранение графика в файл

plt.savefig() записывает текущую фигуру на диск. Формат файла определяется по расширению:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, marker="o")
plt.title("Saved Plot")

plt.savefig("my_plot.png", dpi=150, bbox_inches="tight")
  • Поддерживаемые форматы включают .png, .jpg, .svg и .pdf.
  • bbox_inches="tight" обрезает пустое пространство вокруг фигуры, чтобы ничего не было обрезано.
  • Всегда вызывайте plt.savefig() перед plt.show()plt.show() сбрасывает состояние фигуры.

Распространённые ошибки

plt.show() сбрасывает фигуру. Если вызвать plt.savefig() после plt.show(), будет сохранено пустое изображение. Всегда сначала сохраняйте, затем показывайте.

Работа в неинтерактивных средах. В скриптах plt.show() открывает окно GUI и блокирует выполнение до его закрытия. В Jupyter notebook используйте %matplotlib inline в начале, чтобы графики отображались встроенно. На серверах без дисплея (CI, Docker) переключитесь на неинтерактивный бэкенд: import matplotlib; matplotlib.use("Agg") перед импортом pyplot.

Забытое закрытие фигур. Каждый вызов plt.figure() открывает новую фигуру в памяти. В циклах, генерирующих множество графиков, закрывайте каждую фигуру с помощью plt.close(), чтобы избежать исчерпания памяти.

import matplotlib.pyplot as plt

for i in range(10):
    plt.plot([1, 2, 3], [i, i * 2, i * 3])
    plt.savefig(f"plot_{i}.png")
    plt.close()   # release memory

Перекрывающиеся подграфики. Вызов plt.tight_layout() или plt.subplots_adjust() после создания всех подграфиков устраняет перекрытие заголовков и подписей делений.

Сводная таблица

Тип диаграммыФункцияЛучше всего подходит для
Линейный графикplt.plot()Тенденции в упорядоченных данных
Столбчатая диаграммаplt.bar() / plt.barh()Сравнение дискретных категорий
Круговая диаграммаplt.pie()Соотношение частей и целого
Точечный графикplt.scatter()Взаимосвязь между двумя переменными
Подграфикиplt.subplots()Несколько диаграмм в одной фигуре

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

Was this page helpful?