Введение в деления на графиках Matplotlib
Что такое деления (ticks) и зачем они нужны?
Деления на графиках Matplotlib — это отметки на осях, которые указывают на конкретные значения данных. Они помогают пользователям точно считывать значения с графика и понимать масштаб представления данных. Корректная настройка делений важна для создания информативных и удобных для чтения визуализаций.
Основные понятия: основные и вспомогательные деления
- Основные деления (major ticks) – это главные отметки на осях, которые обычно сопровождаются подписями (метками). Они определяют основной шаг шкалы.
- Вспомогательные деления (minor ticks) – это дополнительные отметки между основными. Они позволяют более детально оценивать значения, не загромождая график.
Импорт Matplotlib и создание простого графика для демонстрации
Для начала работы с делениями необходимо импортировать библиотеку matplotlib.pyplot и создать простой график.
import matplotlib.pyplot as plt
import numpy as np
from typing import List, Tuple
def create_sample_plot() -> Tuple[plt.Figure, plt.Axes]:
"""Создает простой график для демонстрации настройки делений."""
x: np.ndarray = np.linspace(0, 10, 100)
y: np.ndarray = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
return fig, ax
fig, ax = create_sample_plot()
plt.show()
Настройка основных делений (Major Ticks)
Установка местоположения основных делений вручную (Locator)
Locator определяет, где будут располагаться деления. Можно задать местоположение делений вручную, используя plt.xticks() и plt.yticks().
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import FixedLocator
def set_manual_major_ticks(ax: plt.Axes, ticks_x: List[float], ticks_y: List[float]) -> None:
"""Устанавливает местоположение основных делений вручную."""
ax.xaxis.set_major_locator(FixedLocator(ticks_x))
ax.yaxis.set_major_locator(FixedLocator(ticks_y))
fig, ax = create_sample_plot()
set_manual_major_ticks(ax, [0, 2.5, 5, 7.5, 10], [-1, -0.5, 0, 0.5, 1])
plt.show()
Использование автоматических локаторов: AutoLocator, MaxNLocator
Matplotlib предоставляет автоматические локаторы, такие как AutoLocator и MaxNLocator, которые сами выбирают оптимальное расположение делений.
AutoLocator— выбирает локатор в зависимости от диапазона данных.MaxNLocator— старается установить не более N делений.
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
def set_auto_major_locator(ax: plt.Axes, nbins_x: int, nbins_y: int) -> None:
"""Использует MaxNLocator для автоматического выбора местоположения основных делений."""
ax.xaxis.set_major_locator(MaxNLocator(nbins=nbins_x))
ax.yaxis.set_major_locator(MaxNLocator(nbins=nbins_y))
fig, ax = create_sample_plot()
set_auto_major_locator(ax, 5, 4)
plt.show()
Форматирование основных делений: изменение отображаемых значений (Formatter)
Formatter определяет, как будут отображаться значения делений. Можно изменить формат чисел, добавить префиксы или суффиксы.
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import FormatStrFormatter
def set_major_formatter(ax: plt.Axes, fmt_x: str, fmt_y: str) -> None:
"""Устанавливает формат отображения основных делений."""
ax.xaxis.set_major_formatter(FormatStrFormatter(fmt_x))
ax.yaxis.set_major_formatter(FormatStrFormatter(fmt_y))
fig, ax = create_sample_plot()
set_major_formatter(ax, '%.1f', '%.2f')
plt.show()
Настройка внешнего вида основных делений: размер, цвет, направление
Можно изменить внешний вид делений, используя методы tick_params() для осей.
import matplotlib.pyplot as plt
def customize_major_ticks(ax: plt.Axes) -> None:
"""Настраивает внешний вид основных делений."""
ax.tick_params(axis='x', which='major', length=10, width=2, color='red')
ax.tick_params(axis='y', which='major', length=10, width=2, color='blue')
fig, ax = create_sample_plot()
customize_major_ticks(ax)
plt.show()
Настройка вспомогательных делений (Minor Ticks)
Включение и выключение отображения вспомогательных делений
Вспомогательные деления можно включить и выключить с помощью метода minorticks_on() и minorticks_off().
import matplotlib.pyplot as plt
def toggle_minor_ticks(ax: plt.Axes, on: bool) -> None:
"""Включает или выключает отображение вспомогательных делений."""
if on:
ax.minorticks_on()
else:
ax.minorticks_off()
fig, ax = create_sample_plot()
toggle_minor_ticks(ax, True)
plt.show()
Установка местоположения вспомогательных делений (MinorLocator)
Для установки местоположения вспомогательных делений используются MinorLocator.
Использование MultipleLocator и AutoMinorLocator
MultipleLocator— устанавливает деления с заданным интервалом.AutoMinorLocator— автоматически определяет местоположение вспомогательных делений.
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
def set_minor_locator(ax: plt.Axes, n_minor_ticks: int) -> None:
"""Устанавливает автоматическое местоположение вспомогательных делений."""
ax.xaxis.set_minor_locator(AutoMinorLocator(n=n_minor_ticks))
ax.yaxis.set_minor_locator(AutoMinorLocator(n=n_minor_ticks))
fig, ax = create_sample_plot()
set_minor_locator(ax, 4)
plt.show()
Настройка внешнего вида вспомогательных делений
Внешний вид вспомогательных делений настраивается аналогично основным, с использованием tick_params() и указанием which='minor'.
import matplotlib.pyplot as plt
def customize_minor_ticks(ax: plt.Axes) -> None:
"""Настраивает внешний вид вспомогательных делений."""
ax.tick_params(axis='x', which='minor', length=5, width=1, color='gray')
ax.tick_params(axis='y', which='minor', length=5, width=1, color='lightgray')
fig, ax = create_sample_plot()
customize_minor_ticks(ax)
plt.show()
Комбинирование настроек основных и вспомогательных делений
Создание графиков с индивидуальными настройками для каждой оси
Можно настроить каждую ось графика индивидуально, используя отдельные объекты Axes.
Использование FuncFormatter для сложных форматов
FuncFormatter позволяет использовать пользовательскую функцию для форматирования делений. Это полезно для сложных форматов, которые нельзя реализовать стандартными средствами.
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
def format_thousands(x: float, pos: int) -> str:
"""Форматирует числа, разделяя тысячи пробелами."""
return f'{int(x):,}'.replace(',', ' ')
def apply_func_formatter(ax: plt.Axes) -> None:
"""Применяет FuncFormatter к оси Y."""
ax.yaxis.set_major_formatter(ticker.FuncFormatter(format_thousands))
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4, 5], [1000, 2500, 4000, 5500, 7000])
apply_func_formatter(ax)
plt.show()
Примеры настройки делений для различных типов графиков (линейные, столбчатые, точечные диаграммы)
Настройка делений может зависеть от типа графика. Например, для столбчатых диаграмм часто используют целочисленные значения на оси X, а для точечных – более точные значения.
Продвинутые техники и решения проблем
Обработка перекрывающихся делений и меток
Если деления и метки перекрываются, можно использовать plt.tight_layout() или настроить параметры rotation и ha (horizontal alignment) для меток.
Использование matplotlib.ticker для тонкой настройки
Модуль matplotlib.ticker предоставляет широкий набор классов для тонкой настройки делений и меток.
Настройка делений на нелинейных осях (логарифмическая, степенная)
Для нелинейных осей (например, логарифмической) используются специальные локаторы и форматтеры, такие как LogLocator и LogFormatter.