Введение в Matplotlib
Узнайте, что такое Matplotlib, как он работает и как создавать первые графики в Python с примерами линейных диаграмм, подписей и subplot.
Matplotlib — наиболее широко используемая библиотека визуализации данных в Python. В этой главе объясняется, что такое Matplotlib, как устроена его базовая архитектура и как создать первые графики — от минимальной линейной диаграммы до подписанного многопанельного рисунка. Последующие главы этого раздела подробно рассматривают каждый тип графика.
Что такое Matplotlib?
Matplotlib — это библиотека Python с открытым исходным кодом для создания статических, анимированных и интерактивных визуализаций. Джон Д. Хантер выпустил первую версию в 2003 году, изначально стремясь воспроизвести команды построения графиков MATLAB внутри Python. Сегодня она лежит в основе многих высокоуровневых инструментов визуализации (Seaborn, Pandas .plot(), SciPy) и является де-факто стандартом для создания публикационных рисунков в науке и инженерии.
Почему стоит использовать Matplotlib?
- Широкий набор типов графиков — линейные, точечные, столбчатые, гистограммы, круговые, ящичные, скрипичные, тепловые карты, контурные, 3D-поверхности и многое другое.
- Детальный контроль — каждый элемент рисунка (оси, метки делений, шрифты, цвета, легенды) доступен и настраиваем.
- Множество форматов вывода — PNG, PDF, SVG, EPS и интерактивный HTML (через бэкенд
widget). - Интеграция с экосистемой — работает напрямую с массивами NumPy, DataFrame Pandas и SciPy.
- Бесплатный и открытый — лицензия BSD, активное сообщество, обширная документация.
Когда выбирать Matplotlib?
Используйте Matplotlib, когда вам нужен точный, готовый к публикации контроль над каждым визуальным элементом, или когда вы строите систему, требующую хорошо поддерживаемой и стабильной библиотеки. Для быстрых исследовательских графиков по DataFrame встроенный .plot() Pandas (который вызывает Matplotlib под капотом) зачастую быстрее в наборе. Для статистических графиков с более высокоуровневым API популярным дополнением служит Seaborn, который при этом позволяет вернуться к Matplotlib для тонкой настройки.
Структура Matplotlib
Понимание двухуровневой архитектуры Matplotlib позволяет избежать многих недоразумений в будущем.
Объекты Figure и Axes
Каждая визуализация в Matplotlib находится внутри Figure. Figure — это контейнер верхнего уровня, можно считать его холстом. Внутри Figure размещается один или несколько объектов Axes. Axes — это непосредственно область построения, содержащая ось x, ось y, метки делений, линии сетки и данные.
Figure
└── Axes (one or more)
├── x-axis (XAxis)
├── y-axis (YAxis)
├── Title
├── Lines / Patches / Collections (the plotted data)
└── LegendСтиль pyplot и объектно-ориентированный стиль
Matplotlib предоставляет два интерфейса:
Стиль pyplot — набор функций в matplotlib.pyplot, которые автоматически управляют текущими Figure и Axes. Это воспроизводит рабочий процесс MATLAB и удобно для быстрых одноразовых скриптов.
Объектно-ориентированный (OO) стиль — вы явно создаёте объекты Figure и Axes и вызываете методы на них. Этот подход предпочтителен в продакшн-коде, функциях и любых скриптах, создающих более одного рисунка, поскольку явно показывает, к каким именно осям относится каждая команда.
Оба стиля дают одинаковый результат. Примеры в этой главе используют OO-стиль; там, где краткая запись pyplot отличается, это отмечено.
Установка Matplotlib
Matplotlib не входит в стандартную библиотеку Python. Установите его с помощью pip:
pip install matplotlibЕсли вы используете Anaconda или Miniconda, Matplotlib включён по умолчанию. Чтобы установить его явно:
conda install matplotlibПроверьте установку:
python -c "import matplotlib; print(matplotlib.__version__)"Импорт Matplotlib
Стандартное соглашение об импорте, принятое во всём сообществе Python:
Стандартный импорт Matplotlib
import matplotlib.pyplot as pltПсевдоним plt является универсальным — его используют все учебники, книги и ответы на Stack Overflow, поэтому придерживайтесь его.
Если вам также нужен NumPy (что часто требуется для генерации данных):
Импорт Matplotlib и NumPy вместе
import numpy as np
import matplotlib.pyplot as pltПервый график
Простейший скрипт Matplotlib: два списка чисел, один вызов plot(), один вызов show().
Минимальная линейная диаграмма
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4]
y = [0, 1, 4, 9, 16]
fig, ax = plt.subplots() # create Figure and Axes
ax.plot(x, y) # draw a line through the points
plt.show() # open the display window (scripts only)plt.subplots() возвращает кортеж (fig, ax). Большинство кода в этом разделе использует этот паттерн, поскольку он явно указывает, на каких осях вы рисуете.
В Jupyter-ноутбуках plt.show() необязателен — графики отображаются встроенными автоматически по завершении выполнения ячейки.
В автономных скриптах plt.show() открывает окно и приостанавливает выполнение до его закрытия. Без него скрипт завершается раньше, чем появляется окно.
Добавление подписей и заголовка
Подписи осей и заголовок превращают сырой график в понятный рисунок.
Линейная диаграмма с подписями и заголовком
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4]
y = [0, 1, 4, 9, 16]
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('x')
ax.set_ylabel('x squared')
ax.set_title('Square Numbers')
plt.show()| Метод | Что задаёт |
|---|---|
ax.set_xlabel('text') | Подпись горизонтальной оси |
ax.set_ylabel('text') | Подпись вертикальной оси |
ax.set_title('text') | Заголовок над графиком |
См. главу Matplotlib Labels с описанием параметров размера шрифта, начертания и расположения.
Настройка стиля линии и цвета
ax.plot() принимает именованные аргументы, управляющие внешним видом линии.
Красная пунктирная линия
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4]
y = [0, 1, 4, 9, 16]
fig, ax = plt.subplots()
ax.plot(x, y, color='red', linestyle='--', linewidth=2)
ax.set_title('Dashed Red Line')
plt.show()Распространённые значения linestyle: '-' (сплошная, по умолчанию), '--' (пунктирная), ':' (точечная), '-.' (штрихпунктирная).
Распространённые именованные цвета: 'blue', 'red', 'green', 'orange', 'purple', 'black'. Также поддерживаются шестнадцатеричные коды, например '#1f77b4'.
См. Matplotlib Line и Matplotlib Markers для полного перечня параметров стилизации.
Построение нескольких линий и добавление легенды
Вызовите ax.plot() несколько раз, чтобы наложить несколько линий на одни оси. Передайте label= в каждый вызов, затем вызовите ax.legend() для отображения блока легенды.
Две перекрывающиеся линии с легендой
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)', linestyle='--')
ax.set_xlabel('Angle (radians)')
ax.set_ylabel('Value')
ax.set_title('Sine and Cosine')
ax.legend()
plt.show()np.linspace(0, 2 * np.pi, 100) создаёт 100 равномерно распределённых чисел от 0 до 2π — удобный способ получить плавные кривые.
Создание subplot
plt.subplots(rows, cols) создаёт сетку осей внутри одного Figure. Доступ к каждым осям осуществляется по индексу.
Сетка 2×2 из различных типов графиков
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
fig, axs = plt.subplots(2, 2, figsize=(8, 6))
axs[0, 0].plot(x, y)
axs[0, 0].set_title('Line')
axs[0, 1].scatter(x[::5], y[::5]) # every 5th point
axs[0, 1].set_title('Scatter')
axs[1, 0].bar(['A', 'B', 'C'], [3, 7, 5])
axs[1, 0].set_title('Bar')
axs[1, 1].hist(np.random.randn(500), bins=20)
axs[1, 1].set_title('Histogram')
fig.tight_layout() # prevent overlapping labels
plt.show()fig.tight_layout() автоматически регулирует интервалы между subplot, чтобы заголовки и подписи не перекрывались. При использовании subplot почти всегда разумно вызывать эту функцию.
См. Matplotlib Subplot для получения подробной информации о раскладках сеток, общих осях и GridSpec.
Сохранение рисунков
Чтобы сохранить рисунок в файл вместо интерактивного отображения, вызовите fig.savefig() до plt.show().
Сохранение рисунка в форматах PNG и PDF
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('Saved Figure')
fig.savefig('my_plot.png', dpi=150) # raster: PNG at 150 DPI
fig.savefig('my_plot.pdf') # vector: PDF (no DPI needed)
plt.show()Аргумент dpi (точек на дюйм) управляет разрешением для растровых форматов. dpi=150 — хороший баланс между размером файла и качеством печати; dpi=300 является стандартом для журнальных иллюстраций.
Поддерживаемые форматы включают PNG, PDF, SVG, EPS и TIFF. Matplotlib автоматически определяет формат по расширению файла.
Что дальше
В этой главе были представлены основные концепции Matplotlib. Остальные главы раздела Python Matplotlib подробно рассматривают каждую тему:
- Matplotlib Get Started — установка и первые шаги подробно
- Matplotlib Pyplot — объяснение интерфейса pyplot
- Matplotlib Plotting — основы построения графиков
- Matplotlib Line — линейные диаграммы и стилизация
- Matplotlib Markers — маркеры точек данных
- Matplotlib Labels — подписи осей, заголовки и аннотации
- Matplotlib Grid — добавление и стилизация линий сетки
- Matplotlib Subplot — многопанельные рисунки
- Matplotlib Scatter — точечные диаграммы
- Matplotlib Bars — столбчатые диаграммы
- Matplotlib Histograms — диаграммы распределения
- Matplotlib Pie Charts — круговые и кольцевые диаграммы