Matplotlib. Урок 3.3. Настройка графиков. Текстовые элементы графика
![]()
В этом уроке будут подробно рассмотрены текстовые элементы графика, такие как заголовок подложки и поля графика, подписи осей, текстовые блоки и аннотации.
- Текстовые элементы графика
- Заголовок подложки и поля графика
- Подписи осей графика
- Текстовый блок
- Аннотация
- Стиль стрелки
- Стиль соединительной линии
Текстовые элементы графика
В части текстового наполнения при построении графика выделяют следующие составляющие:
- заголовок поля ( title );
- заголовок фигуры ( suptitle );
- подписи осей ( xlabel , ylabel );
- тестовый блок на поле графика ( text ), либо на фигуре ( figtext );
- аннотация ( annotate ) – текст и указатель.
У каждого элемента, который содержит текст, помимо специфических параметров, отвечающих за его настройку, есть параметры класса Text , которые открывают доступ к довольно большому числу настроек внешнего вида и расположения текстового элемента. Более подробно описание параметров, доступных из класса Text , будет дано в одном из следующих уроков.
Ниже представлен код, отображающий все указанные выше текстовые элементы.
plt.figure(figsize=(10,4)) plt.figtext(0.5, -0.1, "figtext") plt.suptitle("suptitle") plt.subplot(121) plt.title("title") plt.xlabel("xlabel") plt.ylabel("ylabel") plt.text(0.2, 0.2, "text") plt.annotate("annotate", xy=(0.2, 0.4), xytext=(0.6, 0.7), arrowprops=dict(facecolor='black', shrink=0.05)) plt.subplot(122) plt.title("title") plt.xlabel("xlabel") plt.ylabel("ylabel") plt.text(0.5, 0.5, "text")
Большую часть из представленные текстовых элементов мы рассмотрели в “ Matplotlib . Урок 2. Работа с инструментом pyplot ”, в этом уроке изучим их более подробно.
Элементы графика, которые содержат текст, имеют ряд настроечных параметров, которые в официальной документации определяются как **kwargs . Это свойства класса matplotlib.text.Text , используемые для управления представлением текста.
Заголовок фигуры и поля графика
Начнем с заголовка поля графика. Текст заголовка для поля устанавливается с помощью функции title() , которая имеет следующие основные аргументы:
- label : str
- Текст заголовка.
- Словарь для управления отображением надписи, содержит следующие ключи:
- ‘fontsize’ : размер шрифта,
- ‘fontweight’ : начертание ,
- ‘verticalalignment’ : вертикальное выравнивание,
- ‘horizontalalignment’ : горизонтальное выравнивание.
- Горизонтальное выравнивание.
- Зазор между заголовком и верхней частью поля графика.
Функция title() также поддерживает в качестве аргументов свойства класса Text :
weight=['light', 'regular', 'bold'] plt.figure(figsize=(12, 4)) for i, lc in enumerate(['left', 'center', 'right']): plt.subplot(1, 3, i+1) plt.title(label=lc, loc=lc, fontsize=12+i*5, fontweight=weight[i], pad=10+i*15)

Заголовок фигуры задается с помощью функции suptitle() , аргументы этой функции аналогичны тем, что были рассмотрены для title() .
Подписи осей графика
Если вы работаете с pyplot , то для установки подписей осей графика используются функции labelx() и labely() . При работе с объектом Axes для этих целей подходят функции set_xlabel() и set_ylabel() .
Основные аргументы функций почти полностью совпадают с теми, что были описаны в функции title() :
- label : str
- Текст подписи.
- Словарь для управления отображением надписи, содержит следующие ключи:
- ‘fontsize’ : размер шрифта,
- ‘fontweight’ : начертание ,
- ‘verticalalignment’ : вертикальное выравнивание,
- ‘horizontalalignment’ : горизонтальное выравнивание.
- Зазор между подписью и осью.
В самом простом случае достаточно передать только подпись в виде строки:
x = [i for i in range(10)] y = [i*2 for i in range(10)] plt.plot(x, y) plt.xlabel("Ось X") plt.ylabel("Ось Y")
Используемые некоторые из дополнительных свойств для настройки внешнего вида подписей осей:
plt.plot(x, y) plt.xlabel("Ось X\nНезависимая величина", fontsize=14, fontweight="bold") plt.ylabel("Ось Y\nЗависимая величина", fontsize=14, fontweight="bold")
Текстовый блок
За установку текстовых блоков на поле графика отвечает функция text() . Через основные параметры этой функции можно задать расположение, содержание и настройки шрифта:
- x: float
- Значение координаты x надписи.
- Значение координаты y надписи.
- Текст надписи.
Для более тонкой настройки внешнего вида воспользуйтесь свойствами класса Text .
В простейшем варианте использование text() будет выглядеть так:
plt.text(0, 7, "HELLO!", fontsize=15) plt.plot(range(0,10), range(0,10))

Использование свойств класса Text , позволяет значительно модифицировать это представление:
bbox_properties=dict( boxstyle="darrow, pad=0.3", ec="k", fc="y", ls="-", lw=3 ) plt.text(2, 7, "HELLO!", fontsize=15, bbox=bbox_properties) plt.plot(range(0,10), range(0,10))

Аннотация
Инструмент Аннотация позволяет установить текстовый блок с заданным содержанием и стрелкой для конкретного места на графике. Аннотация – это мощный инструмент, остановимся на нем более подробно.
Для создания аннотации используется функция annotate() , основными ее аргументами являются:
- text : str
- Текст аннотации.
- Координаты места, на которое будет указывать стрелка.
- Координаты расположения текстовой надписи.
- Система координат, в которой определяется расположение указателя.
- Система координат, в которой определяется расположение текстового блока.
- Параметры отображения стрелки. Имена этих параметров (ключи словаря) являются параметрами конструктора объекта класса FancyArrowPatch .
Ниже представлен пример кода, который демонстрирует простой вариант использования annotation() :
import math x = list(range(-5, 6)) y = [i**2 for i in x] plt.annotate('min', xy=(0, 0), xycoords='data', xytext=(0, 10), textcoords='data', arrowprops=dict(facecolor='g')) plt.plot(x, y)
Параметрам xycoords и textcoords может быть присвоено значение из следующей таблицы:
Значение Описание ‘figure points’ Начало координат – это нижний левый угол фигуры (0, 0). Координаты задаются в точках. ‘figure pixels’ Начало координат – это нижний левый угол фигуры (0, 0). Координаты задаются в пикселях. ‘figure fraction’ Начало координат – это нижний левый угол фигуры (0, 0) при этом верхний правый угол – это точка (1, 1). Координаты задаются в долях от единицы. ‘axes points’ Начало координат – это нижний левый угол поля графика (0, 0). Координаты задаются в точках. ‘axes pixels’ Начало координат – это нижний левый угол поля графика (0, 0). Координаты задаются в пикселях. ‘axes fraction’ Начало координат – это нижний левый угол поля графика (0, 0) при этом верхний правый угол поля – это точка (1, 1). Координаты задаются в долях от единицы. ‘data’ Тип координатной системы: декартова. Работа ведется в пространстве поля графика. ‘polar’ Тип координатной системы: полярная. Работа ведется в пространстве поля графика. Рассмотрим настройку внешнего вида стрелки аннотации. За конфигурирование отображения стрелки отвечает параметр arrowprops , который принимает в качестве значения словарь, ключами которого являются параметры конструктора класса FancyArrowPatch , из них выделим два: arrowstyle , который отвечает за стиль стрелки и connectionstyle – отвечает за стиль соединительной линии.
Стиль стрелки
Параметр: arrowstyle
Тип: str, ArrowStyle, optional
Доступные стили стрелок представлены в таблице и на рисунке ниже.
Класс Имя Атрибуты Curve – None CurveB -> head_length=0.4, head_width=0.2 BracketB -[ widthB=1.0, lengthB=0.2, angleB=None CurveFilledB -|> head_length=0.4, head_width=0.2 CurveA head_length=0.4, head_width=0.2 CurveAB head_length=0.4, head_width=0.2 CurveFilledA <|- head_length=0.4, head_width=0.2 CurveFilledAB head_length=0.4, head_width=0.2 BracketA ]- widthA=1.0, lengthA=0.2, angleA=None BracketAB ]-[ widthA=1.0, lengthA=0.2, angleA=None, widthB=1.0, lengthB=0.2, angleB=None Fancy fancy head_length=0.4, head_width=0.4, tail_width=0.4 Simple simple head_length=0.5, head_width=0.5, tail_width=0.2 Wedge wedge tail_width=0.3, shrink_factor=0.5 
Программный код для построения изображения:
plt.figure(figsize=(7,5)) arrows = ["-", "->", "-[", "|-|", "-|>", "", "<|-", "<|-|>", "fancy", "simple", "wedge"] bbox_properties=dict( boxstyle="round,pad=0.2", ec="k", fc="w", ls="-", lw=1 ) ofs_x = 0 ofs_y = 0 for i, ar in enumerate(arrows): if i == 6: ofs_x = 0.5 plt.annotate(ar, xy=(0.4+ofs_x, 0.92-ofs_y), xycoords='data', xytext=(0.05+ofs_x, 0.9-ofs_y), textcoords='data', fontsize=17, bbox=bbox_properties, arrowprops=dict(arrowstyle=ar) ) if ofs_y == 0.75: ofs_y = 0 else: ofs_y += 0.15
Стиль соединительной линии
Параметр: connectionstyle
Тип: str, ConnectionStyle, or None, optional
Через данный параметр можно задать описание стиля линии, которая соединяет точки ( xy, xycoords ). В качестве значения данный параметр может принимать объект класса ConnectionStyle , или строку, в которой указывается стиль линии соединения с параметрами, перечисленными через запятую.
Класс Имя Атрибуты Angle angle angleA=90, angleB=0, rad=0.0 Angle3 angle3 angleA=90, angleB=0 Arc arc angleA=0, angleB=0, armA=None, armB=None, rad=0.0 Arc3 arc3 rad=0.0 Bar bar armA=0.0, armB=0.0, fraction=0.3, angle=None Ниже представлен пример, который демонстрирует возможности работы с параметром connectionstyle :
import math fig, axs = plt.subplots(2, 3, figsize=(12, 7)) conn_style=[ "angle,angleA=90,angleB=0,rad=0.0", "angle3,angleA=90,angleB=0", "arc,angleA=0,angleB=0,armA=0,armB=40,rad=0.0", "arc3,rad=-1.0", "bar,armA=0.0,armB=0.0,fraction=0.1,angle=70", "bar,fraction=-0.5,angle=180", ] for i in range(2): for j in range(3): axs[i, j].text(0.1, 0.5, "\n".join(conn_style[i*3+j].split(","))) axs[i, j].annotate('text', xy=(0.2, 0.2), xycoords='data', xytext=(0.7, 0.8), textcoords='data', arrowprops=dict(arrowstyle="->", connectionstyle=conn_style[i*3+j]) )
P.S.
Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Построение графиков. Пакет MatPlotLib¶
Работа с графиками и простыми 2D и 3D изображениями реализована в пакете Matplotlib.
Использование пакета очень простое: выбираем нужный тип изображения, загружаем пример, дорабатываем, и получаем результат. Например:
для работы Matplotlib должен быть установлен модуль работы с массивами NumPy .
Прямой способ использования функциональности Matplotlib заключается в импортировании модуля PyPlot : import matplotlib.pyplot as py. Альтернативно можно использовать другое пространство имен PyLab : import pylab as py. Во втором способе также становятся доступны базовые функции пакета работы с массивами NumPy
import pylab as py x = range(10) y = [(float(i)/10.0*3.1415)**2 for i in range(10)] py.errorbar(x, y, yerr=range(10), capsize=3)
Команды построения графиков¶
- один график, толщина линии – 2, линия пунктирная
plot(x, y, '-', lw=2)
plot(x, y, '-', lw=2, x1, y1, 'o', lw=1, x2, y2, '-', ‘r’)
errorbar(x,y,yerr=1.,capsize=3)
scatter(x, y, c=colour, s=size, alpha=0.5, edgecolors='none')
py.hist(x, 50, normed=1, histtype='bar', rwidth=0.8)
im = py.imshow(Z, cmap=py.cm.jet)
py.figure(1) # первое окно py.subplot(211) py.plot([1,2,3]) # первый график py.subplot(212) # второй график py.plot([4,5,6]) py.figure(2) # второе окно py.plot([4,5,6])
при построении графиков x и y должны быть одинаковой размерности!
Задание параметров графиков¶
- При вызове (см. таблицу выше)
- Записать имя объекта – графика и изменять его параметры:
plot=plot(x, y, '-', lw=1) setp(plot, color='r', linewidth=2.0)
Задание легенды¶
- Cразу при построении графика
plot=plot(x, y, '-', lw=1, label=’graph 1’) legend() #показать легенду
- Отдельной командой
p1, = plot([1,2,3]) p2 = plot([3,2,1]) legend([p1,p2], ["line 1","line 2"], loc=2) # присваивает и выводит легенду
Место размещение легенды ¶
Положение Параметр loc верхнее правое 1 верхнее левое 2 нижнее левое 3 нижнее правое 4 правое 5 левое центральное 6 правое центральное 7 внизу поцентру 8 вверху по центру 9 по центру 10 Параметры поля вывода графиков¶
- axis([0, 6, 0, 20]) – пределы графика по осям
- xlabel(„time (s)“) – подпись оси x
- ylabel(„voltage (mV)“) – подпись оси у
- title(„About as simple as it gets, folks“) – название графика
- grid(True) – показать сетку
Команды показа графика¶
ion() + draw() – показ графика в интерактивном режиме. (программа выполняется дальше)
show() – показ графика. Пока окно графика не закрыто программа дальше не выполняется.
Оглавление
- Построение графиков. Пакет MatPlotLib
- Команды построения графиков
- Задание параметров графиков
- Задание легенды
- Параметры поля вывода графиков
- Команды показа графика
Как установить диапазон оси (xlim, ylim) в Matplotlib
Matplotlib — одна из наиболее широко используемых библиотек визуализации данных в Python. Большая часть популярности Matplotlib связана с его параметрами настройки — вы можете настроить практически любой элемент из его иерархии объектов.
В этом руководстве мы рассмотрим, как установить диапазон оси (xlim, ylim) в Matplotlib, чтобы обрезать или расширить представление до определенных пределов.
Создание сюжета
Сначала создадим простой сюжет:
import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots(figsize=(12, 6)) x = np.arange(0, 10, 0.1) y = np.sin(x) z = np.cos(x) ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') plt.show()Здесь мы построили две синусоидальные функции, начиная с 0 и заканчивая 100 с шагом 0.1 . Запуск этого кода дает:

Теперь мы можем настроить диапазон этой оси, которая в настоящее время идет от 0 до 100 .
Установка диапазона оси в Matplotlib
Теперь, если мы хотим усечь это представление на меньшее или даже большее, мы можем настроить пределы X и Y. Доступ к ним можно получить либо через экземпляр PyPlot, либо через экземпляр Axes .
Как установить X-Limit (xlim) в Matplotlib
Давайте сначала установим X-limit, используя как PyPlot, так и экземпляры Axes . Оба эти метода принимают кортеж — левый и правый пределы. Так, например, если мы хотим обрезать представление, чтобы отображать только данные в диапазоне 25-50 по оси X, мы бы использовали xlim([25, 50]) :
fig, ax = plt.subplots(figsize=(12, 6)) x = np.arange(0, 10, 0.1) y = np.sin(x) z = np.cos(x) ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') plt.xlim([25, 50])Это ограничивает просмотр по оси X данными между 25 и 50 и приводит к:

Такого же эффекта можно добиться, задав их через объект ax . Таким образом, если у нас несколько Axes , мы можем установить лимит для них отдельно:
import matplotlib.pyplot as plt import numpy as np fig = plt.figure(figsize=(12, 6)) x = np.arange(0, 10, 0.1) y = np.sin(x) z = np.cos(x) ax = fig.add_subplot(121) ax2 = fig.add_subplot(122) ax.set_title('Full view') ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') ax2.set_title('Truncated view') ax2.plot(y, color='blue', label='Sine wave') ax2.plot(z, color='black', label='Cosine wave') ax2.set_xlim([25, 50]) plt.show()
Как установить Y-Limit (ylim) в Matplotlib
Теперь давайте установим Y-Limit. Этого можно добиться с помощью тех же двух подходов:
ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') plt.ylim([-1, 0])ax.plot(y, color='blue', label='Sine wave') ax.plot(z, color='black', label='Cosine wave') ax.set_ylim([-1, 0])Оба результата приводят к:

Вывод
В этом руководстве мы рассмотрели, как установить диапазон оси (т.е. пределы X и Y) с помощью Matplotlib в Python.
Визуализация данных с matplotlib
Библиотека matplotlib содержит большой набор инструментов для двумерной графики. Она проста в использовании и позволяет получать графики высокого качества. В этом разделе мы рассмотрим наиболее распространенные типы диаграмм и различные настройки их отображения.
Модуль matplotlib.pyplot предоставляет процедурный интерфейс к (объектно-ориентированной) библиотеке matplotlib, который во многом копирует инструменты пакета MATLAB. Инструменты модуля pyplot де-факто являются стандартным способом работы с библиотекой matplotlib , поэтому мы органичимся рассмотрением этого пакета.
Двумерные графики
pyplot.plot
Нарисовать графики функций sin и cos с matplotlib.pyplot можно следующим образом:
import numpy as np import matplotlib.pyplot as plt phi = np.linspace(0, 2.*np.pi, 100) plt.plot(phi, np.sin(phi)) plt.plot(phi, np.cos(phi)) plt.show()В результате получаем

Мы использовали функцию plot, которой передали два параметра — списки значений по горизонтальной и вертикальной осям. При последовательных вызовах функции plot графики строятся в одних осях, при этом происходит автоматическое переключение цвета.
fmt = '[marker][line][color]'функции plot позволяет задавать тип маркера, тип линии и цвет. Приведем несколько примеров:
x = np.linspace(0, 1, 100) f1 = 0.25 - (x - 0.5)**2 f2 = x**3 plt.plot(x, f1, ':b') # пунктирная синяя линия plt.plot(x, f2, '--r') # штрихованная красная линия plt.plot(x, f1+f2, 'k') # черная непрерывная линия plt.show()
rg = np.random.Generator(np.random.PCG64()) plt.plot(rg.binomial(10, 0.3, 6), 'ob') # синие круги plt.plot(rg.poisson(7, 6), 'vr') # красные треугольники plt.plot(rg.integers(0, 10, 6), 'Dk') # черные ромбы plt.show()
Из последнего примера видно, что если в функцию plot передать только один список y , то он будет использован для значений по вертикальной оси. В качестве значений по горизонтальной оси будет использован range(len(y)) .
Более тонкую настройку параметров можно выполнить, передавая различные именованные аргументы, например:
- marker : str — тип маркера
- markersize : float — размер маркера
- linestyle : str — тип линии
- linewidth : float — толщина линии
- color : str — цвет
Полный список доступных параметров можно найти в документации.
pyplot.errorbar
Результаты измерений в физике чаще всего представлены в виде величин с ошибками. Функция plt.errorbar позволяет отображать такие данные:
rg = np.random.Generator(np.random.PCG64(5)) x = np.arange(6) y = rg.poisson(149, x.size) plt.errorbar(x, y, yerr=np.sqrt(y), marker='o', linestyle='none') plt.show()
Ошибки можно задавать и для значений по горизонтальной оси:
rg = np.random.Generator(np.random.PCG64(5)) N = 6 x = rg.poisson(169, N) y = rg.poisson(149, N) plt.errorbar(x, y, xerr=np.sqrt(x), yerr=np.sqrt(y), marker='o', linestyle='none') plt.show()
Ошибки измерений могут быть асимметричными. Для их отображения в качестве параметра yerr (или xerr ) необходимо передать кортеж из двух списков:
rg = np.random.Generator(np.random.PCG64(11)) N = 6 x = np.arange(N) y = rg.poisson(149, N) yerr = [ 0.7*np.sqrt(y), 1.2*np.sqrt(y) ] plt.errorbar(x, y, yerr=yerr, marker='o', linestyle='none') plt.show()
Функция pyplot.errorbar поддерживает настройку отображения графика с помощью параметра fmt и всех именованных параметров, которые доступны в функции pyplot . Кроме того, здесь появляются параметры для настройки отображения линий ошибок (“усов”):
- ecolor : str — цвет линий ошибок
- elinewidth : float — ширина линий ошибок
- capsize : float — длина “колпачков” на концах линий ошибок
- capthick : float — толщина “колпачков” на концах линий ошибок
и некоторые другие. Изменим параметры отрисовки данных из предыдущего примера:
# . plt.errorbar(x, y, yerr=yerr, marker='o', linestyle='none', ecolor='k', elinewidth=0.8, capsize=4, capthick=1) plt.show()
Настройки отображения
Наши графики все еще выглядят довольно наивно. В этой части мы рассмотрим различные настройки, которые позволят достичь качества оформления диаграмм, соответствующего, например, публикациям в рецензируемых журналах.
Диапазон значений осей
Задавать диапазон значений осей в matplotlib можно несколькими способами. Например, так:
pyplot.xlim([0, 200]) # диапазон горизонтальной оси от 0 до 200 pyplot.xlim([0, 1]) # диапазон вертикальной оси от 0 до 1Размер шрифта
Размер и другие свойства шрифта, который используется в matplotlib по умолчанию, можно изменить с помощью объекта matplotlib.rcParams :
matplotlib.rcParams.update('font.size': 14>)Объект matplotlib.rcParams хранит множество настроек, изменяя которые, можно управлять поведением по умолчанию. Смотрите подробнее в документации.
Подписи осей
Подписи к осям задаются следующим образом:
plt.xlabel('run number', fontsize=16) plt.ylabel(r'average current ($\mu A$)', fontsize=16)В подписях к осям (и вообще в любом тексте в matplotlib) можно использовать инструменты текстовой разметки TeX, позволяющие отрисовывать различные математические выражения. TeX-выражения должны быть внутри пары символов $ , кроме того, их следует помещать в r-строки, чтобы избежать неправильной обработки.
Заголовок
Функция pyplot.title задает заголовок диаграммы. Применим наши новые знания:
import numpy as np import matplotlib.pyplot as plt import matplotlib # задаем размер шрифта matplotlib.rcParams.update('font.size': 12>) rg = np.random.Generator(np.random.PCG64(11)) x = np.arange(6) y = rg.poisson(149, x.size) yerr = [ 0.7*np.sqrt(y), 1.2*np.sqrt(y) ] plt.errorbar(x, y, yerr=yerr, marker='o', linestyle='none', ecolor='k', elinewidth=0.8, capsize=4, capthick=1) # добавляем подписи к осям и заголовок диаграммы plt.xlabel('run number', fontsize=16) plt.ylabel(r'average current ($\mu A$)', fontsize=16) plt.title(r'The $\alpha^\prime$ experiment. Season 2020-2021') # задаем диапазон значений оси y plt.ylim([0, 200]) # оптимизируем поля и расположение объектов plt.tight_layout() plt.show()
В этом примере мы использовали функцию pyplot.tight_layout, которая автоматически подбирает параметры отображения так, чтобы различные элементы не пересекались.
Легенда
При построении нескольких графиков в одних осях полезно добавлять легенду — пояснения к каждой линии. Следующий пример показывает, как это делается с помощью аргументов label и функции pyplot.legend :
import numpy as np import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams.update('font.size': 12>) x = np.linspace(0, 1, 100) f1 = 0.25 - (x - 0.5)**2 f2 = x**3 # указываем в аргументе label содержание легенды plt.plot(x, f1, ':b', label='1st component') plt.plot(x, f2, '--r', label='2nd component') plt.plot(x, f1+f2, 'k', label='total') plt.xlabel(r'$x$', fontsize=16) plt.ylabel(r'$f(x)$', fontsize=16) plt.xlim([0, 1]) plt.ylim([0, 1]) # выводим легенду plt.legend(fontsize=14) plt.tight_layout() plt.show()
Функция pyplot.legend старается расположить легенду так, чтобы она не пересекала графики. Аргумент loc позволяет задать расположение легенды вручную. В большинстве случаев расположение по умолчанию получается удачным. Детали и описание других аргументов смотрите в документации.
Сетка
Сетка во многих случаях облегчает анализ графиков. Включить отображение сетки можно с помощью функции pyplot.grid . Аргумент axis этой функции имеет три возможных значения: x , y и both и определяет оси, вдоль которых будут проведены линии сетки. Управлять свойствами линии сетки можно с помощью именованных аргументов, которые мы рассматривали выше при обсуждении функции pyplot.plot .
В matplotlib поддерживается два типа сеток: основная и дополнительная. Выбор типа сетки выполняется с помощью аргумента which , который может принимать три значения: major , minor и both . По умолчанию используется основная сетка.
Линии сетки привязаны к отметкам на осях. Чтобы работать с дополнительной сеткой необходимо сначала включить вспомогательные отметки на осях (которые по умолчанию отключены и к которым привязаны линии дополнительной сетки) с помощью функции pyplot.minorticks_on . Приведем пример:
import numpy as np import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams.update('font.size': 12>) x = np.linspace(-1, 1, 250) plt.plot(x, x, label=r'$x$') plt.plot(x, x**2, label=r'$x^2$') plt.plot(x, x**3, label=r'$x^3$') plt.plot(x, np.cbrt(x), label=r'$x^$') plt.legend(fontsize=16) # включаем дополнительные отметки на осях plt.minorticks_on() plt.xlabel(r'$x$', fontsize=16) plt.xlim([-1., 1.]) plt.ylim([-1., 1.]) # включаем основную сетку plt.grid(which='major') # включаем дополнительную сетку plt.grid(which='minor', linestyle=':') plt.tight_layout() plt.show()
Логарифмический масштаб
Функции pyplot.semilogy и pyplot.semilogx выполняют переключение между линейным и логарифмическим масштабами осей. В некоторых случаях логарифмический масштаб позволяет отобразить особенности зависимостей, которые не видны в линейном масштабе. Вот так выглядят графики экспоненциальных функций в линейном масштабе:

plt.semilogy()делает график гораздо более информативным:

Теперь мы видим поведение функций во всем динамическом диапазоне, занимающем 12 порядков.
Произвольные отметки на осях
Вернемся к первому примеру, в котором мы строили графики синуса и косинуса. Сделаем так, чтобы на горизонтальной оси отметки соответствовали различным долям числа pi и имели соответствующие подписи:

Метки на горизонтальной оси были заданы с помощью функции pyplot.xticks :
plt.xticks( np.linspace(-np.pi, np.pi, 9), [r'$-\pi$', r'$-3\pi/4$', r'$-\pi/2$', r'$-\pi/4$', r'$0$', r'$\pi/4$', r'$+\pi/2$', r'$3\pi/4$', r'$+\pi$'])Модуль pyplot.ticker содержит более продвинутые инструменты для управления отметками на осях. Подробности смотрите в документации.
Размер изображения
До сих пор мы строили графики в одном окне, размер которого был задан по умолчанию. За кадром matplotlib создавал объект типа Figure, который определяет размер окна и содержит все остальные элементы. Кроме того, автоматически создавался объект типа Axis. Подробнее работа с этими объектами будет рассмотрена ниже. Сейчас же мы рассмотрим функцию pyplot.figure , которая позволяет создавать новые объекты типа Figure и переключаться между уже созданными объектами.
Функция pyplot.figure может принимать множество аргументов. Вот основные:
- num : int или str — уникальный идентификатор объекта типа. Если задан новый идентификатор, то создается новый объект и он становится активным. В случае, если передан идентификатор уже существующего объекта, то этот объект возвращается и становится активным
- figsize : (float, float) — размер изображения в дюймах
- dpi : float — разрешение в количестве точек на дюйм
Описание других параметров функции pyplot.figure можно найти в документации. Используем эту функцию и функцию pyplot.axis чтобы улучшить наш пример с построением степенных функций:

Мы добавили две строки по сравнению с прошлой версией:
fig = plt.figure(figsize=(6, 6)) # . plt.axis('equal')Функция pyplot.axis позволяет задавать некоторые свойства осей. Ее вызов с параметром ‘equal’ делает одинаковыми масштабы вертикальной и горизонтальной осей, что кажется хорошей идеей в этом примере. Функция pyplot.axis возвращает кортеж из четырех значений xmin, xmax, ymin, ymax , соответствующих границам диапазонов значений осей.
Некоторые другие способы использования функции pyplot.axis :
- Кортеж из четырех float задаст новые границы диапазонов значений осей
- Строка ‘off’ выключит отображение линий и меток осей
Гистограммы
Обратимся теперь к другим типам диаграмм. Функция pyplot.hist строит гистограмму по набору значений:
import numpy as np import matplotlib.pyplot as plt rg = np.random.Generator(np.random.PCG64(5)) data = rg.poisson(145, 10000) plt.hist(data, bins=40) # для краткости мы опускаем код для настройки осей, сетки и т.д.
Аргумент bins задает количество бинов гистограммы. По умолчанию используется значение 10. Если вместо целого числа в аргумент bins передать кортеж значений, то они будут использованы для задания границ бинов. Таким образом можно построить гистограмму с произвольным разбиением.
Некоторые другие аргументы функции pyplot.hist :
- range : (float, float) — диапазон значений, в котором строится гистограмма. Значения за пределами заданного диапазона игнорируются.
- density : bool . При значении True будет построена гистограмма, соответствующая плотности вероятности, так что площадь гистограммы будет равна единице.
- weights : список float значений того же размера, что и набор данных. Определяет вес каждого значения при построении гистограммы.
- histtype : str . может принимать значения . Определяет тип отрисовки гистограммы.
В качестве первого аргумента можно передать кортеж наборов значений. Для каждого из них будет построена гистограмма. Аргумент stacked со значением True позволяет строить сумму гистограмм для кортежа наборов. Покажем несколько примеров:

rg = np.random.Generator(np.random.PCG64(5)) data1 = rg.poisson(145, 10000) data2 = rg.poisson(140, 2000) # левая гистограмма plt.hist([data1, data2], bins=40) # центральная гистограмма plt.hist([data1, data2], bins=40, histtype='step') # правая гистограмма plt.hist([data1, data2], bins=40, stacked=True)В физике гистограммы часто представляют в виде набора значений с ошибками, предполагая при этом, что количество событий в каждом бине является случайной величиной, подчиняющейся биномиальному распределению. В пределе больших значений флуктуации количества событий в бине могут быть описаны распределением Пуассона, так что характерная величина флуктуации определяется корнем из числа событий. Библиотека matplotlib не имеет инструмента для такого представления данных, однако его легко получить с помощью комбинации numpy.histogram и pyplot.errorbar :
def poisson_hist(data, bins=60, lims=None): """ Гистограмма в виде набора значений с ошибками """ hist, bins = np.histogram(data, bins=bins, range=lims) bins = 0.5 * (bins[1:] + bins[:-1]) return (bins, hist, np.sqrt(hist)) rg = np.random.Generator(np.random.PCG64(5)) data = rg.poisson(145, 10000) x, y, yerr = poisson_hist(data, bins=40, lims=(100, 190)) plt.errorbar(x, y, yerr=yerr, marker='o', markersize=4, linestyle='none', ecolor='k', elinewidth=0.8, capsize=3, capthick=1)
Диаграммы рассеяния
Распределение событий по двум измерениям удобно визуализировать с помощью диаграммы рассеяния:
rg = np.random.Generator(np.random.PCG64(5)) means = (0.5, 0.9) covar = [ [1., 0.6], [0.6, 1.] ] data = rg.multivariate_normal(means, covar, 5000) plt.scatter(data[:,0], data[:,1], marker='o', s=1)
Каждой паре значений в наборе данных соответствует одна точка на диаграмме. Несмотря на свою простоту, диаграмма рассеяния позволяет во многих случаях наглядно представлять двумерные данные. Функция pyplot.scatter позволяет визуализировать и данные более высокой размерности: размер и цвет маркера могут быть заданы для каждой точки отдельно:
rg = np.random.Generator(np.random.PCG64(4)) data = rg.uniform(-1, 1, (50, 2)) col = np.arctan2(data[:, 1], data[:, 0]) size = 100*np.sum(data**2, axis=1) plt.scatter(data[:,0], data[:,1], marker='o', s=size, c=col)
Цветовую палитру можно задать с помощью аргумента cmap . Подробности и описание других аргументов функции pyplot.scatter можно найти в документации.
Контурные диаграммы
Контурные диаграммы позволяют визуализировать функции двух переменных:
from scipy import stats means = (0.5, 0.9) covar = [ [1., 0.6], [0.6, 1.] ] mvn = stats.multivariate_normal(means, covar) x, y = np.meshgrid( np.linspace(-3, 3, 80), np.linspace(-2, 4, 80) ) data = np.dstack((x, y)) # левая диаграмма — без заливки цветом plt.contour(x, y, mvn.pdf(data), levels=10) # правая диаграмма — с заливкой цветом plt.contourf(x, y, mvn.pdf(data), levels=10)
Аргумент levels задает количество контуров. По умолчанию контуры отрисовываются равномерно между максимальным и минимальным значениями. В аргумент levels также можно передать список уровней, на которых следует провести контуры.
Обратите внимание на использование функций numpy.meshgrid и numpy.dstack в этом примере.
Контурную диаграмму можно дополнить цветовой полосой colorbar , вызвав функцию pyplot.colorbar :
cs = plt.contourf(x, y, mvn.pdf(data), levels=15, cmap=matplotlib.cm.magma_r) cbar = plt.colorbar(cs)
Более подробное описание функций plt.contour и plt.contourf смотрите в документации.
Расположение нескольких осей в одном окне
В одном окне (объекте Figure ) можно разместить несколько осей (объектов axis.Axis ). Функция pyplot.subplots создает объект Figure , содержащий регулярную сетку объектов axis.Axis :
import numpy as np from scipy import stats import matplotlib.pyplot as plt fig, axes = plt.subplots(ncols=3, nrows=2, figsize=(12, 8)) x = np.linspace(0.01, 25, 250) for idx, row in enumerate(axes): for jdx, ax in enumerate(row): ndf = idx * 3 + jdx + 1 y = stats.chi2.pdf(x, ndf) ax.plot(x, y, label=fr'$\chi^2_ndf>>>(x)$') ax.set_xlabel(r'$x$', fontsize=16) ax.set_ylim([0, 1.05*y.max()]) ax.minorticks_on() ax.legend(fontsize=16) ax.grid(which='major') ax.grid(which='minor', linestyle=':') fig.tight_layout() plt.show()
Количество строк и столбцов, по которым располагаются различные оси, задаются с помощью параметров nrows и ncols , соответственно. Функция pyplot.subplots возвращает объект Figure и двумерный список осей axis.Axis . Обратите внимание на то, что вместо вызовов функций модуля pyplot в этом примере использовались вызовы методов классов Figure и axis.Axis .
В последнем примере горизонтальная ось во всех графиках имеет один и тот же диапазон. Аргумент sharex функции pyplot.subplots позволяет убрать дублирование отрисовки осей в таких случаях:
fig, axes = plt.subplots(ncols=3, nrows=2, figsize=(12, 8), sharex=True) # . for idx, row in enumerate(axes): for jdx, ax in enumerate(row): # . if idx: ax.set_xlabel(r'$x$', fontsize=16)
Существует аналогичный параметр sharey для вертикальной оси.
Более гибкие возможности регулярного расположения осей предоставляет функция pyplot.subplot. Мы не будем рассматривать эту функцию и ограничимся лишь ее упоминанием.
Функция pyplot.axes позволяет добавлять новые оси в текущем окне в произвольном месте:
import numpy as np import matplotlib.pyplot as plt exno = 26 rg = np.random.Generator(np.random.PCG64(5)) x1 = rg.exponential(10, 5000) x2 = rg.normal(10, 0.1, 100) # Строим основную гистограмму plt.hist([x1, x2], bins=150, range=(0, 60), stacked=True) plt.minorticks_on() plt.xlim((0, 60)) plt.grid(which='major') plt.grid(which='minor', linestyle=':') # Строим вторую гистограмму в отдельных осях plt.axes([.5, .5, .4, .4]) plt.hist([x1, x2], bins=100, stacked=True, range=(9, 11)) plt.grid(which='major') plt.tight_layout() # сохраняем диаграмму в файл plt.savefig('histograms.png') plt.show()
В этом примере была использована функция pyplot.savefig , сохраняющая содержимое текущего окна в файл в векторном или растровом формате. Формат задается с помощью аргумента format или автоматически определяется из имени файла (как в примере выше). Набор доступных форматов зависит от окружения, однако в большинстве случаев можно использовать такие форматы как png , jpeg , pdf , svg и eps .
Резюме
Предметом изучения в этом разделе был модуль pyplot библиотеки matplotlib , содержащий инструменты для построения различных диаграмм. Были рассмотрены:
- функции для построения диаграмм pyplot.plot , pyplot.errorbar . pyplot.hist , pyplot.scatter , pyplot.contour и pyplot.contourf ;
- средства настройки свойств линий и маркеров;
- средства настройки координатных осей: подписи, размер шрифта, координатная сетка, произвольные метки др.;
- инструмены для расположения нескольких координатных осей в одном окне.
Рассмотренные инструменты далеко не исчерпывают возможности библиотеки matplotlib , однако их должно быть достаточно в большинстве случаев для визуализации данных. Мы рекомендуем заинтересованному читалелю изучить список источников, в которых можно найти много дополнительной информации.
Источники
- matplotlib.pyplot
- Pyplot tutorial
- Colormaps
- Scipy Lecture Notes