Использование библиотеки Matplotlib. Как изменять настройки по умолчанию | jenyay.net

Использование библиотеки Matplotlib. Как изменять настройки по умолчанию

Дата публикации: 26.02.2012
Дата последней правки: 25.02.2023

Оглавление

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

Глобальное изменение настроек. Файл matplotlibrc

Для начала рассмотрим, как можно изменять параметры по умолчанию глобально для всех скриптов, использующих Matplotlib. Для этого предназначен файл с именем matplotlibrc. Располагаться он может в разных местах в зависимости от его области действия:

  1. В директории со скриптом (в рабочей директории). В этом случае изменение глобальных параметров с помощью matplotlibrc влияет только на скрипты, расположенные в этой директории.
  2. В поддиректории .matplotlib внутри директории настроек пользователя, то есть под Linux полный путь до файла настроек может выглядеть как ~/.config/matplotlib/matplotlibrc или $XDG_CONFIG_HOME/matplotlib/matplotlibrc. Под Windows этот файл будет иметь путь C:\Users\USERNAME\.matplotlib\matplotlibrc. В этом случае параметры, измененные в этом файле будут касаться всех скриптов, запущенных из-под данного пользователя.
  3. В директории, где установлена библиотека Matplotlib. Например, под Linux это может быть ~/.local/lib/python3.10/site-packages/matplotlib/mpl-data/.

Файл matplotlibrc является текстовым, каждая строка которого описывает отдельный параметр в виде:

параметр: значение

При этом некоторые параметры имеют вложенную структуру:

параметр.подпараметр1: значение
параметр.подпараметр2: значение

Для комментариев используется символ #, работающий так же, как и в Python.

Какие же параметры могут меняться в этом файле? Для этого полезно взглянуть на файл matplotlibrc, прилагающийся к исходникам библиотеки Matplotlib. В этом файле описаны возможные параметры с подробными комментариями, а заодно описаны значения по умолчанию.

Изменение внешнего вида графика

Для демонстрации работы с файлом matplotlibrc напишем небольшой скрипт, рисующий график функции y = f(x):

import pylab
import numpy as np

if __name__ == '__main__':
    x = np.linspace(0, 4 * np.pi, 300)
    y = np.sin(x) * np.cos(x * 3)

    pylab.plot(x, y)
    pylab.show()

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

Изменим настройки построения графика по умолчанию таким образом, чтобы отображалась сетка на графике (даже если мы не вызываем функцию grid()) и изменим цвет графика по умолчанию. Для этого в директории со скриптом создадим файл matplotlibrc со следующим содержимым:

axes.grid: True
axes.prop_cycle: cycler('color', ['eb7d34', 'ff7f0e', '2ca02c', 'd62728', '9467bd', '8c564b', 'e377c2', '7f7f7f', 'bcbd22', '17becf'])

Первая строка с помощью параметра axes.grid включает по умолчанию отображение сетки. Вторая строка представляет собой описание циклической последовательности, содержащей цвета, которые используются для отображения линий графика, если цвет не указан в явном виде (более подробно это описано в статье Как в Matplotlib менять оформление линий по умолчанию). В данном примере было взято значение из исходного файла matplotlibrc и изменен первый цвет.

Если теперь запустить скрипт, приведенный выше, то окно с графиком будет выглядеть следующим образом:

Файл matplotlibrc можно переместить в директорию C:\Users\USERNAME\.matplotlib (под Windows) или в ~/.config/matplotlib/matplotlibrc под Linux, и результат будет прежний, только значения по умолчанию теперь будут применяться к графикам всех скриптов, запущенных под данным пользователем.

Нет смысла описывать все возможные параметры из файла matplotlibrc, в исходниках файла matplotlibrc они все описаны, поэтому рассмотрим лишь некоторые из них.

Добавим два параметра (lines.linewidth и lines.linestyle), чтобы изменить толщину линии по умолчанию и сделать ее штриховой:

axes.grid: True
axes.prop_cycle: cycler('color', ['eb7d34', 'ff7f0e', '2ca02c', 'd62728', '9467bd', '8c564b', 'e377c2', '7f7f7f', 'bcbd22', '17becf'])
lines.linewidth: 3
lines.linestyle: --

Результат показан на следующем рисунке:

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

figure.dpi: 80
figure.figsize: 4, 3

В этом примере мы установили разрешение рисунка, заданное по умолчанию (80 dpi), а затем задали размер фигуры 4 x 3 дюйма (значение по умолчанию - 8 x 6 дюймов). Размер задается в дюймах, т.к. Matplotlib может рисовать графики не только на экране, но и выводить их в файлы, например в графические SVG, PNG, PDF и PS.

Результат работы все того же скрипта с данными настройками показан на следующем рисунке.

Выбор используемой графической библиотеки

Отдельно хочется сказать про параметр backend, который задает, с помощью какой библиотеки будут создаваться окна с графиками. Дело в том, что Matplotlib для создания графического интерфейса может использовать разные библиотеки, и не все они могут быть доступны в системе. Иногда переключение на другую библиотеку может решить проблемы, связанные с тем, что окно почему-то не отображается. В старых версиях Matplotlib этот параметр обязательно должен был присутствовать в файле matplotlibrc, но сейчас это уже не актуально, и если он не задан, то Matplotlib будет перебирать известные ей библиотеки для создания GUI и использовать ту из доступных, которая попадется первой.

Параметр backend может принимать одно из следующих значений:

  • MacOSX
  • QtAgg
  • Gtk4Agg
  • Gtk3Agg
  • TkAgg
  • WxAgg
  • Agg
  • QtCairo
  • GTK4Cairo
  • GTK3Cairo
  • TkCairo
  • WxCairo
  • Cairo
  • Qt5Agg
  • Qt5Cairo
  • PS
  • PDF
  • SVG
  • Template
  • WebAgg

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

Давайте посмотрим, как изменится результат работы предыдущего скрипта, если в файл matplotlibrc добавить параметр backend с разными значениями (предыдущие настройки также оставим). Работоспособность того или иного значения параметра backend зависит от установленных в системе библиотек.


backend: QtAgg

backend: Gtk4Agg

backend: WxAgg

backend: TkAgg

Такие значения параметра backend как Agg, Cairo, PS, PDF, SVG предназначены для вывода результатов в файлы, а не на экран, поэтому приведенный выше скрипт не будет работать - будет выведена ошибка при вызове функции show().

Обнаружение файла matplotlibrc

Особенностью работы Matplotlib с файлами matplotlibrc заключается в том, что при выполнении скрипта учитывается только один такой файл. То есть, если в папке со скриптом есть этот файл, то в директории пользователя matplotlibrc уже не учитывается. Аналогично, если есть файл в директории пользователя, то не важно, что содержит файл в директории с установленной библиотекой.

Для того, чтобы определить, какой именно файл matplotlibrc используется, предназначена функция matplotlib_fname() из модуля matplotlib.

Например, если запустить интерпретатор Python из директории, где имеется файл matplotlibrc, то в результате выполнения следующих команд

>>> import matplotlib
>>> matplotlib.matplotlib_fname()

мы увидим:

'matplotlibrc'

Если в текущей директории нет файла matplotlibrc, но он есть в настройках пользователя, то предыдущий пример выведет строку:

'/home/USERNAME/.config/matplotlib/matplotlibrc'

Изменение значений по умолчанию в пределах скрипта

Как изменять глобальные параметры сразу для многих скриптов мы разобрались, однако во многих случаях использование файла matplotlibrc - это слишком кардинальное решение, если значение по умолчанию нужно установить только для конкретного скрипта. Для изменения значений по умолчанию можно использовать переменную rcParams из модуля matplotlib, которая представляет собой словарь, где в качестве ключа используются все те же параметры, что используются в файле matplotlibrc, а в качестве значений - соответственно значения этих параметров.

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

import matplotlib
import pylab
import numpy as np

if __name__ == '__main__':
    matplotlib.rcParams['lines.linewidth'] = 3
    matplotlib.rcParams['lines.linestyle'] = '--'
    matplotlib.rcParams['axes.grid'] = True

    x = np.linspace(0, 4 * np.pi, 300)
    y = np.sin(x) * np.cos(x * 3)

    pylab.plot(x, y)
    pylab.show()

В результате чего мы получим тот же самый результат, что и при модификации файла matplotlibrc:

Кроме того, в модуле matplotlib есть еще переменная rcParamsDefault, аналогичная rcParams, но содержащая значения по умолчанию. Так что при желании можно восстановить значения по умолчанию из rcParamsDefault. Но только НЕ ДЕЛАЙТЕ так: matplotlib.rcParams = matplotlib.rcParamsDefault. Думаю, вы понимаете почему. Не забывайте клонировать словарь со значениями по умолчанию, если вы хотите вернуться ко всем значениям по умолчанию:

matplotlib.rcParams = dict(matplotlib.rcParamsDefault)

или

matplotlib.rcParams = matplotlib.rcParamsDefault.copy()

Заключение

Мы рассмотрели способы установки параметров по умолчанию для графиков, научились менять эти параметры глобально, чтобы они действовали сразу на множество скриптов, а также локально в пределах одного скрипта. Рассмотрели пути, где может располагаться файл matplotlibrc, в котором описываются значения по умолчанию. Рассмотрели некоторые из возможных параметров, особенно много внимания уделили параметру backend, с помощью которого можно выбирать графическую библиотеку, которую будет использовать Matplotlib.

Похожие статьи

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
4.5 stars

Рейтинг 4.2/5. Всего 6 голос(а, ов)




Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 379