Настройка шрифтов в matplotlib: от базовых приемов до продвинутых

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

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

    Каждый, кто хоть раз создавал графики с помощью matplotlib, сталкивался с этой проблемой: по умолчанию шрифты нечитабельно маленькие, особенно когда дело доходит до презентаций или публикаций. Вместо того чтобы мучительно пытаться разглядеть подписи к осям через увеличительное стекло, давайте раз и навсегда разберёмся, как контролировать каждый текстовый элемент в ваших визуализациях. От быстрых хаков до системных решений — эта статья содержит всё, что вам нужно знать о настройке шрифтов в matplotlib. 🔍

Хотите полностью освоить визуализацию данных и другие ключевые навыки аналитика? Курс Профессия аналитик данных от Skypro — это не просто теория, а практический опыт работы с реальными данными, включая создание профессиональных отчётов и визуализаций. Вы научитесь создавать графики, которые не только информативны, но и визуально привлекательны для любой аудитории. Программа разработана с учетом требований рынка труда!

Быстрая настройка размера шрифта в matplotlib

Первое, что нужно понять о matplotlib — у него множество способов сделать одно и то же. Это касается и настройки размера шрифта. Давайте начнем с самых простых и быстрых способов, которые помогут мгновенно улучшить ваши графики.

Самый прямолинейный метод — передача параметра fontsize непосредственно в функции, которые создают текстовые элементы:

Python
Скопировать код
import matplotlib.pyplot as plt
import numpy as np

# Создаем простой график
x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y)

# Настраиваем размер шрифта напрямую
plt.title('Синусоида', fontsize=20)
plt.xlabel('Ось X', fontsize=16)
plt.ylabel('Ось Y', fontsize=16)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)

plt.show()

Значения параметра fontsize можно указывать как численно (в пунктах), так и с помощью предустановленных строковых значений:

Строковое значение Размер в пунктах Применение
xx-small 8pt Мелкие аннотации, примечания
x-small 10pt Детализированные подписи
small 12pt Подписи к осям
medium 14pt Основной текст
large 16pt Заголовки разделов
x-large 20pt Главные заголовки
xx-large 24pt Заголовки презентаций

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

Python
Скопировать код
# Быстрая настройка для всего графика
plt.figure(figsize=(10, 6))
plt.rcParams.update({'font.size': 14}) # Устанавливаем базовый размер шрифта для всего графика

plt.plot(x, y)
plt.title('Синусоида') # Теперь все текстовые элементы будут размера 14
plt.xlabel('Ось X')
plt.ylabel('Ось Y')

plt.show()

Михаил Левин, руководитель отдела визуализации данных

На одной из презентаций для совета директоров мне поручили представить комплексный анализ эффективности продаж. Диаграммы выглядели безупречно на моем мониторе, но когда они появились на большом экране в конференц-зале, текст был практически нечитаем. Я быстро открыл Jupyter Notebook и добавил всего одну строчку кода:

plt.rcParams.update({'font.size': 18})

Затем регенерировал все графики. Эта маленькая правка спасла презентацию — все подписи осей, легенды и заголовки стали четкими и хорошо видимыми даже с задних рядов. С тех пор я всегда начинаю работу над визуализациями с настройки глобальных параметров шрифтов, учитывая условия, в которых они будут демонстрироваться.

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

Пошаговый план для смены профессии

Изменение размера текста осей и заголовков графиков

Оси и заголовки — самые заметные текстовые элементы любого графика. Их правильная настройка критически важна для читаемости всей визуализации. Давайте подробно разберем, как работать с этими элементами. 📊

Для осей у нас есть несколько уровней настройки:

  • Метки осей (названия X и Y осей)
  • Тики осей (числовые значения вдоль осей)
  • Заголовок графика (основное название визуализации)
  • Подзаголовок (дополнительный описательный текст)

Рассмотрим более продвинутые методы настройки с использованием объектно-ориентированного API matplotlib:

Python
Скопировать код
fig, ax = plt.subplots(figsize=(10, 6))

ax.plot(x, y)

# Настройка меток осей
ax.set_xlabel('Ось X', fontsize=16, fontweight='bold')
ax.set_ylabel('Ось Y', fontsize=16, fontweight='bold')

# Настройка заголовка
ax.set_title('Детальный анализ синусоиды', fontsize=20, pad=20)

# Настройка тиков (делений) осей
ax.tick_params(axis='x', labelsize=14)
ax.tick_params(axis='y', labelsize=14)

plt.show()

Обратите внимание на дополнительные параметры, которые мы использовали:

  • fontweight — для изменения жирности текста ('normal', 'bold', 'light' и т.д.)
  • pad — для регулировки расстояния между заголовком и графиком
  • tick_params — для комплексной настройки делений осей

Если вам нужно настроить только некоторые тики осей, можно использовать более гибкий подход:

Python
Скопировать код
# Выборочное форматирование тиков
import matplotlib.ticker as ticker

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y)

# Настраиваем только определенные тики на оси X
formatter = ticker.FuncFormatter(lambda x, pos: f'Точка {int(x)}' if x % 2 == 0 else '')
ax.xaxis.set_major_formatter(formatter)
ax.xaxis.set_tick_params(labelsize=12) # Размер шрифта для этих выборочных тиков

plt.show()

Для сложных графиков с несколькими подграфиками можно настраивать размер шрифта индивидуально для каждого:

Python
Скопировать код
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

ax1.plot(x, y)
ax1.set_title('График 1', fontsize=18)
ax1.tick_params(labelsize=12)

ax2.plot(x, np.cos(x))
ax2.set_title('График 2', fontsize=14) # Разный размер шрифта
ax2.tick_params(labelsize=10) # Разный размер тиков

# Общий заголовок для всей фигуры
fig.suptitle('Сравнительный анализ', fontsize=22)

plt.tight_layout(rect=[0, 0, 1, 0.95]) # Корректировка отступов для общего заголовка
plt.show()

Глобальные параметры шрифтов через rc-конфигурацию

Когда вы работаете над серией графиков и хотите поддерживать единый стиль, постоянно указывать размер шрифта для каждого элемента становится утомительным. Здесь на помощь приходит система rc-параметров matplotlib, которая позволяет устанавливать глобальные настройки стиля. 🔧

RC-параметры (от "runtime configuration") — это мощный инструмент для единообразной настройки всех графиков в вашем проекте:

Python
Скопировать код
# Настройка глобальных параметров шрифтов
plt.rcParams.update({
'font.size': 14, # Базовый размер шрифта
'axes.titlesize': 18, # Размер заголовков осей
'axes.labelsize': 16, # Размер меток осей
'xtick.labelsize': 14, # Размер тиков оси X
'ytick.labelsize': 14, # Размер тиков оси Y
'legend.fontsize': 15, # Размер шрифта легенды
'figure.titlesize': 22 # Размер заголовка фигуры
})

# Теперь создаем график с примененными настройками
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y, label='sin(x)')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_title('График синусоиды')
ax.legend()
plt.show()

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

RC-параметры можно сохранять в отдельном стиле и применять при необходимости:

Python
Скопировать код
# Создаем и применяем свой стиль
from matplotlib import style

# Определяем свой стиль
style_dict = {
'font.size': 14,
'axes.titlesize': 18,
'axes.labelsize': 16,
'xtick.labelsize': 14,
'ytick.labelsize': 14,
'legend.fontsize': 15,
'figure.titlesize': 22
}

# Применяем стиль временно в контексте
with plt.style.context(style_dict):
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y)
ax.set_title('График с временным стилем')
plt.show()

# Вне контекста используются стандартные настройки
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y)
ax.set_title('График со стандартным стилем')
plt.show()

Можно также использовать встроенные стили matplotlib и дополнять их своими настройками шрифтов:

Python
Скопировать код
# Использование встроенного стиля с дополнительными настройками шрифта
plt.style.use('ggplot') # Применяем встроенный стиль

# Дополняем его своими настройками шрифтов
plt.rcParams.update({
'font.size': 16,
'axes.titlesize': 20
})

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y)
ax.set_title('График с комбинированным стилем')
plt.show()

Параметр rc-конфигурации Что настраивает Рекомендуемое значение для презентаций
font.size Базовый размер шрифта 14-16pt
axes.titlesize Заголовки осей 18-20pt
axes.labelsize Метки осей (X и Y) 16-18pt
xtick.labelsize/ytick.labelsize Тики (деления) осей 14-16pt
legend.fontsize Текст в легенде 14-16pt
figure.titlesize Заголовок всей фигуры 20-24pt
font.weight Жирность шрифта 'normal' или 'bold'

Анна Михайлова, научный сотрудник в области машинного обучения

При подготовке моей докторской диссертации я столкнулась с серьезной проблемой: требовалось создать более 50 графиков, каждый с множеством подграфиков, и все они должны были соответствовать строгим требованиям форматирования научного журнала. Размер шрифта, стиль и расположение текста — всё имело значение.

Вместо того чтобы настраивать каждый график отдельно, что заняло бы недели, я создала файл стилей matplotlib:

Python
Скопировать код
# Файл mystyle.py
def set_journal_style():
import matplotlib.pyplot as plt
plt.rcParams.update({
'font.family': 'serif',
'font.serif': 'Times New Roman',
'font.size': 12,
'axes.labelsize': 14,
'axes.titlesize': 16,
'xtick.labelsize': 12,
'ytick.labelsize': 12,
'legend.fontsize': 12,
'figure.titlesize': 18
})

Затем в начале каждого скрипта я просто импортировала эту функцию:

Python
Скопировать код
from mystyle import set_journal_style
set_journal_style()

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

Настройка шрифта для легенд и аннотаций в matplotlib

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

Начнем с настройки легенд, которые объясняют, что именно отображает каждый элемент на графике:

Python
Скопировать код
fig, ax = plt.subplots(figsize=(10, 6))

# Добавляем несколько линий с метками
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.plot(x, np.sin(x) * np.cos(x), label='sin(x)cos(x)')

# Настраиваем легенду с различными параметрами шрифта
legend = ax.legend(
fontsize=14,
title='Функции',
title_fontsize=16,
frameon=True,
edgecolor='gray',
loc='upper right'
)

plt.show()

Помимо базового размера шрифта, для легенды можно настроить множество параметров:

  • title_fontsize — размер шрифта заголовка легенды
  • frameon — отображение рамки вокруг легенды
  • edgecolor — цвет рамки
  • loc — расположение легенды на графике

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

Python
Скопировать код
legend = ax.legend(fontsize=14)
legend.get_title().set_fontsize(18) # Настраиваем заголовок отдельно
legend.get_title().set_fontweight('bold') # Делаем заголовок жирным

Аннотации — это текстовые пояснения, которые указывают на конкретные точки или области графика. Они особенно полезны для выделения важных значений или трендов:

Python
Скопировать код
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x))

# Добавляем простую аннотацию
ax.annotate(
'Максимум функции', # Текст аннотации
xy=(np.pi/2, 1), # Координаты точки, на которую указывает аннотация
xytext=(np.pi/2 + 1, 0.8), # Координаты текста аннотации
fontsize=14, # Размер шрифта
fontweight='bold', # Жирность шрифта
arrowprops=dict( # Свойства стрелки
facecolor='black',
shrink=0.05,
width=2
)
)

plt.show()

Для более сложных аннотаций можно использовать текстовые блоки с различными стилями:

Python
Скопировать код
from matplotlib.patches import FancyBboxPatch

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x))

# Создаем текстовый блок с особым форматированием
textbox = ax.text(
5, 0.8,
"Важное наблюдение:\nПериодичность функции sin(x)\nравна 2π",
fontsize=14,
bbox=dict(
boxstyle="round,pad=0.5",
facecolor='lightblue',
edgecolor='navy',
alpha=0.7
)
)

plt.show()

Для ситуаций, когда нужно добавить много аннотаций, полезно создать функцию-помощник:

Python
Скопировать код
def add_annotation(ax, text, x, y, fontsize=12, **kwargs):
"""Вспомогательная функция для создания аннотаций в едином стиле"""
return ax.annotate(
text,
xy=(x, y),
xytext=(x + 0.5, y + 0.1),
fontsize=fontsize,
arrowprops=dict(arrowstyle="->", color='red'),
**kwargs
)

# Использование:
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x))

# Добавляем несколько аннотаций в едином стиле
add_annotation(ax, "Точка 1", 1, np.sin(1), fontsize=14)
add_annotation(ax, "Точка 2", 4, np.sin(4), fontsize=14, color='blue')
add_annotation(ax, "Точка 3", 7, np.sin(7), fontsize=14, fontweight='bold')

plt.show()

Продвинутые методы форматирования текста на графиках

Иногда базовых настроек шрифта недостаточно, и вам требуется более гибкое форматирование текста на графиках. В этом разделе мы рассмотрим продвинутые техники, которые позволят вам создавать по-настоящему профессиональные визуализации. ⚙️

Одна из самых мощных возможностей — использование TeX-разметки для форматирования математических выражений и сложного текста:

Python
Скопировать код
# Включаем поддержку TeX
plt.rcParams.update({
'text.usetex': True,
'font.family': 'serif',
'font.serif': ['Computer Modern Roman'],
})

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x))

# Используем TeX-разметку для форматирования
ax.set_title(r'$\mathbf{График\ функции}\ \sin(x)$', fontsize=20)
ax.set_xlabel(r'$x\ \in\ [0, 10]$', fontsize=16)
ax.set_ylabel(r'$\sin(x)$', fontsize=16)

# Добавляем сложное математическое выражение
ax.text(
5, 0.8,
r'$\int_{0}^{\pi} \sin(x) dx = 2$',
fontsize=18,
bbox=dict(facecolor='white', alpha=0.8)
)

plt.tight_layout()
plt.show()

Обратите внимание на префикс r перед строками с TeX-разметкой — это сырые строки (raw strings), которые позволяют корректно обрабатывать обратные слеши.

Если вы не хотите использовать полноценный TeX, можно воспользоваться встроенной в matplotlib поддержкой математической разметки:

Python
Скопировать код
# Отключаем полный TeX, но используем mathtext
plt.rcParams.update({
'text.usetex': False,
'mathtext.default': 'regular'
})

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x))

# Используем mathtext для форматирования
ax.set_title(r'$\mathbf{График\ функции}\ \sin(x)$', fontsize=20)
ax.set_xlabel(r'$x\ \in\ [0, 10]$', fontsize=16)
ax.set_ylabel(r'$\sin(x)$', fontsize=16)

plt.show()

Для продвинутого форматирования можно комбинировать разные шрифты и стили в одном текстовом элементе:

Python
Скопировать код
from matplotlib.font_manager import FontProperties

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x))

# Создаем разные шрифты
normal_font = FontProperties(family='serif', size=14)
bold_font = FontProperties(family='serif', size=14, weight='bold')
italic_font = FontProperties(family='serif', size=14, style='italic')

# Добавляем текст с разными стилями
ax.text(1, 0.8, 'Обычный текст', fontproperties=normal_font)
ax.text(3, 0.6, 'Жирный текст', fontproperties=bold_font)
ax.text(5, 0.4, 'Курсивный текст', fontproperties=italic_font)
ax.text(7, 0.2, 'Комбинация стилей\nв многострочном тексте',
fontproperties=bold_font, color='red')

plt.show()

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

Python
Скопировать код
# Поддержка Unicode и многоязычного текста
plt.rcParams.update({
'font.family': 'DejaVu Sans', # Шрифт с широкой поддержкой Unicode
})

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x))

# Добавляем текст на разных языках
ax.set_title('Многоязычный график', fontsize=18)
ax.text(2, 0.7, 'English text', fontsize=14)
ax.text(4, 0.5, 'Русский текст', fontsize=14)
ax.text(6, 0.3, '日本語テキスト', fontsize=14)
ax.text(8, 0.1, '👍 😊 🔥', fontsize=16) # Эмодзи тоже работают!

plt.show()

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

Метод Преимущества Недостатки
TeX-разметка Идеально для математических формул, профессиональный вид Требует установки TeX, сложный синтаксис
Mathtext (встроенный) Не требует TeX, проще в использовании Ограниченный функционал по сравнению с полным TeX
FontProperties Точный контроль над шрифтами, гибкость Многословный код, сложнее для быстрого использования
HTML/Unicode Поддержка многоязычного текста и специальных символов Зависимость от установленных шрифтов, возможные проблемы с совместимостью
Python
Скопировать код
from matplotlib.patches import Rectangle, FancyArrowPatch

fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(x, np.sin(x), linewidth=2)

# Добавляем выделенную область
rect = Rectangle((4, -0.5), 2, 1, facecolor='yellow', alpha=0.3)
ax.add_patch(rect)

# Добавляем стрелку с текстом
arrow = FancyArrowPatch(
(7, 0.8), (5, 0.2),
arrowstyle='-|>',
linewidth=2,
color='red'
)
ax.add_patch(arrow)

# Добавляем поясняющий текст с форматированием
ax.text(
7.1, 0.8,
"Ключевая область\nанализа",
fontsize=14,
fontweight='bold',
va='center'
)

# Добавляем заголовок с улучшенным форматированием
ax.set_title(
'Комплексный анализ периодической функции',
fontsize=20,
pad=20,
fontweight='bold',
color='navy'
)

plt.tight_layout()
plt.show()

Настройка шрифтов в matplotlib — это не просто косметический вопрос, а ключевой компонент эффективной визуализации данных. Выбирая правильный размер, стиль и форматирование текста, вы можете значительно повысить информативность и профессионализм ваших графиков. От простых параметров fontsize до продвинутых техник с использованием TeX и собственных шрифтов — инструментарий matplotlib предлагает решение для любых потребностей. Главное — помнить о конечной цели: ваша визуализация должна быть не только красивой, но и понятной для целевой аудитории.

Загрузка...