Изменение размера подписей осей в Matplotlib: полное руководство

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

Зачем изменять размер подписей осей?

  • Читаемость: Слишком мелкий шрифт нечитаем, особенно в сложных визуализациях или при просмотре на разных устройствах. Слишком крупный может загромождать график.
  • Согласованность: При создании серии графиков для отчета или публикации важно поддерживать единый стиль, включая размеры шрифтов.
  • Акцентирование: Иногда требуется выделить определенную ось, сделав ее подпись крупнее.
  • Вписывание в макет: При встраивании графиков в документы или веб-страницы необходимо адаптировать размер шрифта под окружающий контент.

Обзор основных понятий о подписях осей

В Matplotlib подписи осей – это текстовые элементы, связанные с осями X и Y, поясняющие, какие данные представлены вдоль этих осей. Они отличаются от меток делений (tick labels), которые показывают конкретные значения на оси. Управление размером подписей осей осуществляется через различные методы и параметры библиотеки.

Основные способы изменения размера подписей осей

Рассмотрим наиболее распространенные подходы к настройке размера шрифта подписей.

Использование fontsize в xlabel() и ylabel()

Самый прямой способ изменить размер подписи при ее создании – использовать параметр fontsize непосредственно в функциях matplotlib.pyplot.xlabel() и matplotlib.pyplot.ylabel(). Этот метод удобен для быстрой настройки отдельных графиков.

import matplotlib.pyplot as plt
import numpy as np
from typing import List, Union

def plot_simple_graph(x: np.ndarray, y: np.ndarray, x_label: str, y_label: str, font_size: Union[int, str]) -> None:
    """Создает простой график с заданным размером подписей осей."""
    plt.figure()
    plt.plot(x, y)
    plt.xlabel(x_label, fontsize=font_size)  # Установка размера для подписи оси X
    plt.ylabel(y_label, fontsize=font_size)  # Установка размера для подписи оси Y
    plt.title(f'График с размером шрифта подписей: {font_size}')
    plt.grid(True)
    plt.show()

# Пример использования (данные о посещаемости сайта)
x_days: np.ndarray = np.arange(1, 31)
y_visits: np.ndarray = np.random.randint(500, 1500, size=30)

plot_simple_graph(x_days, y_visits, 'День месяца', 'Количество посещений', 14) # Размер 14
plot_simple_graph(x_days, y_visits, 'День месяца', 'Количество посещений', 'large') # Использование строковых псевдонимов

Параметр fontsize может принимать числовые значения (размер в пунктах) или строковые псевдонимы ('xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large').

Использование fontsize в set_xlabel() и set_ylabel()

При работе с объектно-ориентированным интерфейсом Matplotlib (используя объекты Figure и Axes) применяются методы set_xlabel() и set_ylabel() объекта Axes. Они также принимают параметр fontsize.

import matplotlib.pyplot as plt
import numpy as np
from typing import Union

def plot_oo_graph(x: np.ndarray, y: np.ndarray, x_label: str, y_label: str, font_size: Union[int, str]) -> None:
    """Создает график через OO-интерфейс с заданным размером подписей."""
    fig, ax = plt.subplots() # Создаем Figure и Axes
    ax.plot(x, y)
    ax.set_xlabel(x_label, fontsize=font_size) # Установка размера через Axes
    ax.set_ylabel(y_label, fontsize=font_size) # Установка размера через Axes
    ax.set_title(f'OO-график (fontsize={font_size})')
    ax.grid(True)
    plt.show()

# Пример использования
x_days: np.ndarray = np.arange(1, 31)
y_revenue: np.ndarray = np.random.uniform(100, 500, size=30) * x_days

plot_oo_graph(x_days, y_revenue, 'День', 'Дневная выручка ($)', 16)

Этот подход предпочтительнее при работе со сложными макетами, включающими несколько графиков.

Применение matplotlib.pyplot.xticks() и matplotlib.pyplot.yticks()

Хотя функции xticks() и yticks() в первую очередь предназначены для управления метками делений (tick labels) и самими делениями, они также могут влиять на размер шрифта этих меток через параметр fontsize. Это не прямое управление подписями осей (xlabel/ylabel), но часто настраивается вместе с ними.

import matplotlib.pyplot as plt
import numpy as np

# Данные для примера
x: np.ndarray = np.linspace(0, 2 * np.pi, 100)
y: np.ndarray = np.sin(x)

plt.figure()
plt.plot(x, y)
plt.xlabel('Угол (радианы)')
plt.ylabel('Синус угла')

# Изменение размера шрифта меток делений
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)

plt.title('График с измененным размером меток делений')
plt.grid(True)
plt.show()

Более продвинутые методы изменения размера подписей

Для более гибкого и глобального управления размерами существуют продвинутые техники.

Изменение размера с помощью rcParams

Matplotlib позволяет настраивать параметры по умолчанию через словарь matplotlib.rcParams. Это удобно для установки единого стиля для всех графиков в сессии или проекте.

import matplotlib.pyplot as plt
import numpy as np

# Установка глобальных параметров
plt.rcParams['axes.labelsize'] = 16 # Размер для xlabel и ylabel
plt.rcParams['xtick.labelsize'] = 12 # Размер для меток делений оси X
plt.rcParams['ytick.labelsize'] = 12 # Размер для меток делений оси Y

# Создание графика (размеры будут применены автоматически)
fig, ax = plt.subplots()
x: np.ndarray = np.arange(10)
y: np.ndarray = x**2
ax.plot(x, y)
ax.set_xlabel('Значение X') # Размер будет 16
ax.set_ylabel('Значение Y = X^2') # Размер будет 16
ax.set_title('График с глобально заданными размерами')
ax.grid(True)
plt.show()

# Важно: Восстановить значения по умолчанию, если нужно
# plt.rcdefaults()

Ключевой параметр для подписей осей – axes.labelsize.

Изменение размера подписей для нескольких графиков (subplots)

При использовании plt.subplots() для создания сетки графиков, можно итерироваться по объектам Axes и применять set_xlabel/set_ylabel с нужным fontsize к каждому.

import matplotlib.pyplot as plt
import numpy as np
from typing import Union

fig, axs = plt.subplots(1, 2, figsize=(12, 5)) # Создаем сетку 1x2

x_data: np.ndarray = np.linspace(0, 10, 100)
y1_data: np.ndarray = np.exp(-x_data / 5.0)
y2_data: np.ndarray = np.cos(x_data)

common_xlabel: str = 'Время (сек)'
label_fontsize: Union[int, str] = 14

# График 1
axs[0].plot(x_data, y1_data)
axs[0].set_xlabel(common_xlabel, fontsize=label_fontsize)
axs[0].set_ylabel('Амплитуда сигнала 1', fontsize=label_fontsize)
axs[0].set_title('Экспоненциальное затухание')
axs[0].grid(True)

# График 2
axs[1].plot(x_data, y2_data)
axs[1].set_xlabel(common_xlabel, fontsize=label_fontsize)
axs[1].set_ylabel('Амплитуда сигнала 2', fontsize=label_fontsize)
axs[1].set_title('Косинусоидальный сигнал')
axs[1].grid(True)

plt.tight_layout() # Автоматическая коррекция расположения
plt.show()

Использование labelpad для настройки расстояния между подписью и осью

Параметр labelpad в set_xlabel и set_ylabel контролирует расстояние (в пунктах) между подписью оси и самой осью (включая метки делений). Это полезно, чтобы избежать перекрытия подписи с метками делений.

Реклама
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
x: np.ndarray = np.arange(5)
y: np.ndarray = np.random.rand(5)

ax.plot(x, y, 'o-')
ax.set_xlabel('Категория', fontsize=14, labelpad=15) # Увеличиваем отступ для подписи X
ax.set_ylabel('Значение', fontsize=14, labelpad=10) # Отступ для подписи Y
ax.tick_params(axis='x', labelsize=12)
ax.set_title('Пример использования labelpad')
plt.show()

Контроль форматирования подписей осей

Помимо размера, можно настраивать и другие аспекты отображения подписей.

Изменение шрифта подписей осей

Параметры fontname или fontproperties в функциях xlabel/ylabel и set_xlabel/set_ylabel, а также соответствующие rcParams (font.family, font.serif, font.sans-serif, etc.) позволяют задать семейство шрифтов.

plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = ['Times New Roman'] + plt.rcParams['font.serif']

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_xlabel('Ось X', fontsize=14) # Шрифт будет Times New Roman (если установлен)
ax.set_ylabel('Ось Y', fontsize=14, fontname='Arial') # Можно переопределить локально
plt.show()

# Сброс настроек шрифта
# plt.rcdefaults()

Изменение цвета подписей осей

Параметр color позволяет задать цвет подписи.

fig, ax = plt.subplots()
ax.plot([0, 1], [1, 0])
ax.set_xlabel('Синяя подпись', fontsize=14, color='blue')
ax.set_ylabel('Красная подпись', fontsize=14, color='#FF0000') # HEX-код
plt.show()

Поворот подписей осей для лучшей читаемости

Хотя поворот чаще применяется к меткам делений (tick labels), параметр rotation технически доступен и для подписей осей (xlabel, ylabel), но используется редко. Для меток делений это делается через plt.xticks(rotation=...) или ax.tick_params(axis='x', rotation=...).

fig, ax = plt.subplots()
categories = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май']
values = np.random.randint(100, 500, size=len(categories))

ax.bar(categories, values)
ax.set_ylabel('Продажи (шт.)', fontsize=12)
ax.set_xlabel('Месяц', fontsize=12)

# Поворот меток делений оси X для лучшей читаемости
plt.xticks(rotation=45, ha='right', fontsize=11) # ha='right' для выравнивания

plt.title('Продажи по месяцам с повернутыми метками')
plt.tight_layout()
plt.show()

Примеры кода и лучшие практики

Пример 1: Простое изменение размера подписей

import matplotlib.pyplot as plt
import numpy as np
from typing import Union

def plot_ad_clicks(days: np.ndarray, clicks: np.ndarray, font_size: Union[int, str]) -> None:
    """График кликов по рекламе с заданным размером подписей."""
    plt.figure(figsize=(8, 4))
    plt.plot(days, clicks, marker='.')
    plt.xlabel('День', fontsize=font_size)
    plt.ylabel('Количество кликов', fontsize=font_size)
    plt.title('Динамика кликов по рекламному объявлению')
    plt.grid(True)
    plt.show()

# Данные
d: np.ndarray = np.arange(1, 16)
c: np.ndarray = 100 + np.random.rand(15) * 50 + d * 5

plot_ad_clicks(d, c, 14)

Пример 2: Использование rcParams для глобальной настройки

import matplotlib.pyplot as plt
import numpy as np

def create_traffic_plot() -> None:
    """Создает график трафика с использованием глобальных настроек."""
    x: np.ndarray = np.arange(7)
    y_organic: np.ndarray = np.array([120, 150, 140, 180, 200, 210, 230])
    y_paid: np.ndarray = np.array([50, 60, 80, 70, 90, 110, 100])

    fig, ax = plt.subplots(figsize=(9, 5))
    ax.plot(x, y_organic, label='Органика')
    ax.plot(x, y_paid, label='Платный трафик')

    ax.set_xlabel('День недели') # Размер будет из rcParams
    ax.set_ylabel('Посещения сайта') # Размер будет из rcParams
    ax.set_title('Источники трафика по дням недели')
    ax.set_xticks(x)
    ax.set_xticklabels(['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс']) # Метки тоже затронуты rcParams
    ax.legend()
    ax.grid(True)
    plt.show()

# Устанавливаем глобальные размеры
original_params = plt.rcParams.copy() # Сохраняем исходные параметры
plt.rcParams['axes.labelsize'] = 'large'
plt.rcParams['xtick.labelsize'] = 'medium'
plt.rcParams['ytick.labelsize'] = 'medium'
plt.rcParams['legend.fontsize'] = 'medium'
plt.rcParams['axes.titlesize'] = 'x-large'

create_traffic_plot()

# Восстанавливаем исходные параметры
plt.rcParams.update(original_params)

Пример 3: Настройка подписей для сложных графиков (Subplots)

См. пример в разделе ‘Изменение размера подписей для нескольких графиков (subplots)’ выше.

Рекомендации по выбору размера шрифта

  • Контекст: Учитывайте, где будет отображаться график (презентация, публикация, веб-страница).
  • Размер графика: Для больших графиков можно использовать больший шрифт, для маленьких – меньший.
  • Баланс: Поддерживайте баланс между размером подписей осей, меток делений и заголовка.
  • Иерархия: Заголовок обычно самый крупный, подписи осей – крупнее меток делений.
  • Тестирование: Всегда проверяйте читаемость на целевом устройстве или носителе.
  • Стандартные размеры: Часто используются размеры 10-14pt для основного текста и подписей в публикациях.

Решение распространенных проблем

Подписи перекрываются

  • Решение 1: Уменьшить fontsize.
  • Решение 2: Использовать plt.tight_layout() или fig.tight_layout() для автоматической корректировки.
  • Решение 3: Увеличить labelpad, чтобы отодвинуть подпись от оси.
  • Решение 4: Для меток делений (tick labels) использовать поворот (rotation).

Размер шрифта не меняется

  • Проверьте область видимости: Убедитесь, что вы применяете метод (xlabel, set_xlabel) к правильному объекту (plt или Axes).
  • Порядок выполнения: При использовании rcParams убедитесь, что настройки применены до создания элементов графика.
  • Переопределение: Проверьте, не переопределяется ли размер шрифта где-то позже в коде.
  • Кэширование: В некоторых средах (например, Jupyter) может потребоваться перезапуск ядра для применения изменений rcParams.

Подписи отображаются неправильно после сохранения графика

  • bbox_inches='tight': При сохранении через plt.savefig() используйте bbox_inches='tight', чтобы включить все элементы, включая подписи, в сохраняемый файл.
    python
    plt.savefig('my_plot.png', dpi=300, bbox_inches='tight')
  • Формат файла: Некоторые форматы (например, PDF, SVG) лучше сохраняют векторную графику и текст.
  • tight_layout() перед сохранением: Вызовите plt.tight_layout() непосредственно перед plt.savefig().

Заключение

Краткое изложение основных моментов

Изменение размера подписей осей в Matplotlib – важная задача для создания профессиональных и читаемых визуализаций. Основные методы включают использование параметра fontsize в функциях xlabel/ylabel и set_xlabel/set_ylabel, а также глобальную настройку через rcParams. Дополнительные параметры, такие как labelpad, color, fontname и rotation (для меток делений), предоставляют полный контроль над внешним видом подписей. Выбор метода зависит от конкретной задачи – от быстрой настройки одного графика до установки единого стиля для всего проекта.

Дополнительные ресурсы для изучения Matplotlib


Добавить комментарий