Python Matplotlib: Построение графиков — Полное руководство
Узнайте, как создавать и настраивать линейные графики, столбчатые диаграммы, круговые диаграммы, точечные графики и подграфики в Python с помощью Matplotlib.
Matplotlib — самая широко используемая библиотека для визуализации данных в Python. В этом руководстве объясняется, как создавать наиболее распространённые типы графиков — линейные графики, столбчатые диаграммы, круговые диаграммы, точечные графики и подграфики — и как настраивать их с помощью подписей, цветов, легенд и элементов управления разметкой. Предполагается, что вы уже установили Matplotlib и можете запускать скрипты Python локально.
Что такое построение графиков в Matplotlib?
Модуль pyplot библиотеки Matplotlib предоставляет интерфейс в стиле MATLAB, позволяющий строить графики шаг за шагом: создать фигуру, добавить данные, добавить подписи, а затем отобразить или сохранить результат. Каждый график создаётся по одной и той же схеме:
- Импортировать
matplotlib.pyplot(обычно какplt). - Вызвать функцию построения (
plt.plot(),plt.bar()и т. д.) с вашими данными. - Вызвать декораторные функции для добавления заголовков, подписей осей, легенд и прочего.
- Вызвать
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() | Несколько диаграмм в одной фигуре |
Связанные главы
- Введение в Matplotlib — обзор библиотеки и её компонентов
- Начало работы с Matplotlib — установка и первый график
- Линейные графики в Matplotlib — стили линий, маркеры и многорядные графики в деталях
- Столбчатые диаграммы в Matplotlib — вертикальные, горизонтальные и составные столбцы
- Круговые диаграммы в Matplotlib — выдвинутые секторы, пользовательские цвета и кольцевые диаграммы
- Гистограммы в Matplotlib — графики распределения и управление бинами
- Точечные графики в Matplotlib — пузырьковые диаграммы и точечные графики с цветовым отображением
- Подграфики в Matplotlib — расширенные многопанельные компоновки
- Подписи в Matplotlib — заголовки, подписи осей, аннотации и текст
- Сетка в Matplotlib — линии сетки и настройка делений
- Маркеры в Matplotlib — стили маркеров, размеры и цвета контуров