При отображении
графиков граничные значения по каждой из осей по умолчанию определяются
автоматически, исходя из набора отображаемых данных. Однако, иногда требуется
указывать свои лимитные значения. Для существующих осей (после их создания)
настройка граничных значений производится с помощью метода 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
Создать экземпляр:
и указать в качестве
параметра у оси 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 будут отключены и мы
увидим следующий результат:
Вот так можно задавать
граничные значения и расположение меток на координатных осях.