Граничные значения осей и локаторы для расположения меток на них

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

ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax))

Например, отобразим линейный график, который в оси Ox имеет диапазон [0; 19], а по оси Oy диапазон [0; 5]:

import numpy as np
import matplotlib.pyplot as plt
 
fig = plt.figure(figsize=(7, 4))
ax = fig.add_subplot()
ax.plot(np.arange(1, 5, 0.25))
 
plt.show()

Давайте изменим этот диапазон на другой:

ax.set(xlim=(-5, 30), ylim=(-1, 6))

Теперь по оси абсцисс имеем значения [-5; 30], а по оси ординат – [-1; 6]. Ту же самую операцию можно выполнить и с помощью методов:

ax.set_xlim(-5, 30)
ax.set_ylim(-1, 6)

Или, если нужно применить ограничения к последней активной системе координат, то достаточно выполнить функции:

plt.xlim(-1, 20)
plt.ylim(-1, 6)

Если нужно сделать ограничения только по одному из пределов, то используются именованные параметры:

xmin, xmax, ymin, ymax

следующим образом:

ax.set_xlim(xmin = -1)
ax.set_ylim(ymax = 4)

Положение меток на координатных осях

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

  • set_major_locator() – управление рисками крупной сетки;
  • set_minor_locator() – управление рисками мелкой сетки.

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

matplotlib.ticker.Locator

NullLocator

Давайте воспользуемся самым простым производным классом NullLocator, который используется для сокрытия меток по выбранной оси. Вначале его нужно импортировать:

from matplotlib.ticker import NullLocator

Создать экземпляр:

lc = NullLocator()

и указать в качестве параметра у оси Ox или Oy:

ax.grid()
ax.xaxis.set_major_locator(lc)

Мы здесь включаем сетку, чтобы эффект был лучше виден и отключаем риски у оси Ox. Для этого обращаемся к объекту xaxis (ось Ox) и вызываем для него метод set_major_locator().

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

ax.xaxis.set_major_locator(NullLocator())

Увидим тот же результат. Аналогично можно отключать метки и по оси Oy:

ax.yaxis.set_major_locator(NullLocator())

LinearLocator

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

ax.yaxis.set_major_locator(LinearLocator(5))

Результат будет следующим:

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

MultipleLocator

Следующий класс MultipleLocator позволяет задавать шаг изменения значений между соседними рисками. Для этого используется единственный параметр base этого класса, который и определяет шаг следования значений в соответствии с формулой:

base ∙ i,    где  i = ±1, ±2, ...

Например, укажем шаг изменения по оси Ox, равным 1:

ax.xaxis.set_major_locator(MultipleLocator(base=1))

Получим результат:

Или, другой шаг в 3,5:

ax.xaxis.set_major_locator(MultipleLocator(base=3.5))

Число рисок по оси Ox станет меньше:

IndexLocator

Следующий класс IndexLocator работает аналогичным образом, что и класс MultipleLocator, но производит отсчет значений рисок не от 0, а от наименьшего значения данных графика. В конструкторе класса IndexLocator определены два параметра:

  • base – шаг изменения между соседними рисками;
  • offset – смещение относительно наименьшего значения.

Например, сформируем график синусоиды:

x = np.arange(-np.pi/2, np.pi, 0.1)
ax.plot(x, np.sin(x))

И по оси Ox отложим метки с помощью IndexLocator с шагом 0,5 и нулевым смещением:

ax.grid()
ax.xaxis.set_major_locator(IndexLocator(base=0.5, offset=0))

Смотрите, данные на графике начинаются со значения -1,57, что примерно соответствует значению -pi/2. Остальные величины меняются с шагом 0,5.

Давайте укажем смещение в 0,57:

ax.xaxis.set_major_locator(IndexLocator(base=0.5, offset=0.57))

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

Здесь значения рисок по оси абсцисс примерно кратны 0,5.

FixedLocator

Это очень простой класс локатора, который устанавливает метки в указанных значениях. Например, так:

ax.xaxis.set_major_locator(FixedLocator([-2, -1, 0, 1, 2, 3]))

LogLocator

Для формирования логарифмических делений по осям используется класс LogLocator. Его параметр base определяет число, которое будет возводиться в степень чисел:

base ^ i,  i = 0, 1, 2, …

По умолчанию используется base=10, но мы можем поменять основание и указать любое другое, например, два:

ax.xaxis.set_major_locator(LogLocator(base=2))

MaxNLocator

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

ax.xaxis.set_major_locator(MaxNLocator())

На выходе получим следующее изображение графика:

Давайте теперь зададим максимальное число рисок, равное пяти и посмотрим на результат:

ax.xaxis.set_major_locator(MaxNLocator(nbins=5))

Локатор создал разбиение с четырьмя рисками. То есть, он решил, что такое разбиение будет наиболее понятным, т.к. значения рисок принимают «красивые» значения и с ними будет легко работать конечному пользователю. В общем, в этом и заключается цель этого локатора. Более подробную информацию можно почитать на странице официальной документации:

https://matplotlib.org/api/ticker_api.html#matplotlib.ticker.MaxNLocator

Использование функции set_minor_locator()

Все те же самые действия можно выполнять и с мелкой (минорной) сеткой. Для этого ее нужно сначала включить и показать на графике:

ax.minorticks_on()
ax.grid(which='major', lw = 2) 
ax.grid(which='minor')

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

После того, как мы включили минорную сетку, то для нее с помощью функции set_minor_locator() можно также задавать различные локаторы, например, NullLocator:

ax.xaxis.set_minor_locator(NullLocator())

В результате, риски по оси Ox будут отключены и мы увидим следующий результат:

Вот так можно задавать граничные значения и расположение меток на координатных осях.