Настройка шрифтов в matplotlib: от базовых приемов до продвинутых
Для кого эта статья:
- Аналитики данных и специалисты, работающие с визуализацией данных.
- Студенты и изучающие машинное обучение и статистику.
Профессионалы, готовящие визуализации для научных публикаций и презентаций.
Каждый, кто хоть раз создавал графики с помощью matplotlib, сталкивался с этой проблемой: по умолчанию шрифты нечитабельно маленькие, особенно когда дело доходит до презентаций или публикаций. Вместо того чтобы мучительно пытаться разглядеть подписи к осям через увеличительное стекло, давайте раз и навсегда разберёмся, как контролировать каждый текстовый элемент в ваших визуализациях. От быстрых хаков до системных решений — эта статья содержит всё, что вам нужно знать о настройке шрифтов в matplotlib. 🔍
Хотите полностью освоить визуализацию данных и другие ключевые навыки аналитика? Курс Профессия аналитик данных от Skypro — это не просто теория, а практический опыт работы с реальными данными, включая создание профессиональных отчётов и визуализаций. Вы научитесь создавать графики, которые не только информативны, но и визуально привлекательны для любой аудитории. Программа разработана с учетом требований рынка труда!
Быстрая настройка размера шрифта в matplotlib
Первое, что нужно понять о matplotlib — у него множество способов сделать одно и то же. Это касается и настройки размера шрифта. Давайте начнем с самых простых и быстрых способов, которые помогут мгновенно улучшить ваши графики.
Самый прямолинейный метод — передача параметра fontsize непосредственно в функции, которые создают текстовые элементы:
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 при создании фигуры:
# Быстрая настройка для всего графика
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:
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— для комплексной настройки делений осей
Если вам нужно настроить только некоторые тики осей, можно использовать более гибкий подход:
# Выборочное форматирование тиков
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()
Для сложных графиков с несколькими подграфиками можно настраивать размер шрифта индивидуально для каждого:
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") — это мощный инструмент для единообразной настройки всех графиков в вашем проекте:
# Настройка глобальных параметров шрифтов
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-параметры можно сохранять в отдельном стиле и применять при необходимости:
# Создаем и применяем свой стиль
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 и дополнять их своими настройками шрифтов:
# Использование встроенного стиля с дополнительными настройками шрифта
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
Легенды и аннотации играют ключевую роль в интерпретации данных, особенно в сложных графиках с множеством линий или точек. Правильная настройка шрифтов в этих элементах может значительно улучшить восприятие вашей визуализации. 🏷️
Начнем с настройки легенд, которые объясняют, что именно отображает каждый элемент на графике:
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— расположение легенды на графике
Для более точного контроля над легендой можно получить объект легенды и настраивать его свойства:
legend = ax.legend(fontsize=14)
legend.get_title().set_fontsize(18) # Настраиваем заголовок отдельно
legend.get_title().set_fontweight('bold') # Делаем заголовок жирным
Аннотации — это текстовые пояснения, которые указывают на конкретные точки или области графика. Они особенно полезны для выделения важных значений или трендов:
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()
Для более сложных аннотаций можно использовать текстовые блоки с различными стилями:
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()
Для ситуаций, когда нужно добавить много аннотаций, полезно создать функцию-помощник:
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-разметки для форматирования математических выражений и сложного текста:
# Включаем поддержку 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 поддержкой математической разметки:
# Отключаем полный 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()
Для продвинутого форматирования можно комбинировать разные шрифты и стили в одном текстовом элементе:
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()
Для работы с многоязычным текстом или специальными символами необходимо убедиться, что выбранный шрифт поддерживает нужные глифы:
# Поддержка 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 | Поддержка многоязычного текста и специальных символов | Зависимость от установленных шрифтов, возможные проблемы с совместимостью |
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 предлагает решение для любых потребностей. Главное — помнить о конечной цели: ваша визуализация должна быть не только красивой, но и понятной для целевой аудитории.