Pandas & NumPy Academy · Урок

Подписи, заголовки и сохранение графиков

Добавляйте подписи осей, заголовок, легенду и форматирование делений, а затем сохраняйте графики публикационного качества с помощью savefig().

Урок 4 из 413 шагов

«Подписи, заголовки и сохранение графиков» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

От графика к публикации

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

Подписи осей с помощью set_xlabel и set_ylabel

Задайте информативные подписи осей с помощью ax.set_xlabel() и ax.set_ylabel(). Всегда указывайте единицы измерения в подписи (например, 'Revenue (USD)', а не просто 'Revenue'). Используйте fontsize, чтобы увеличить подписи для презентаций, а labelpad — чтобы добавить расстояние между осью и текстом подписи, если деления занимают много места.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(7, 4))
x = np.arange(1, 13)
y = np.random.randint(100, 500, 12)
ax.plot(x, y, 'o-', color='steelblue')

ax.set_xlabel('Month', fontsize=12, labelpad=8)
ax.set_ylabel('Revenue (USD thousands)', fontsize=12, labelpad=8)
# plt.show()
plt.close()

Заголовки с set_title и suptitle

ax.set_title() задаёт заголовок над одной областью Axes. Для многопанельных рисунков fig.suptitle() добавляет общий заголовок над всеми подграфиками. Управляйте размером шрифта с помощью fontsize, а вертикальным положением — с помощью y (по умолчанию 1.0). Хороший заголовок сообщает основную мысль графика, а не просто описывает оси. Сравните 'Monthly Revenue' и 'Revenue Peaked in Q3 and Fell 20% in Q4'.

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
ax1.plot([1,2,3], [1,4,9])
ax1.set_title('Subplot One', fontsize=11)

ax2.bar(['A','B','C'], [3,7,2])
ax2.set_title('Subplot Two', fontsize=11)

# Shared figure title
fig.suptitle('Annual Overview Dashboard', fontsize=14, fontweight='bold', y=1.02)
plt.tight_layout()
plt.close()

Управление подписями делений

Стандартные подписи делений Matplotlib часто подходят, но иногда требуются пользовательские подписи. Используйте ax.set_xticks(), чтобы указать положения делений, и ax.set_xticklabels(), чтобы задать подписи. Передайте rotation=45, чтобы наклонить длинные подписи и предотвратить их наложение. Параметр ha='right' (горизонтальное выравнивание) обеспечивает правильную привязку наклонённых подписей к соответствующим делениям.

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
          'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
values = np.random.randint(200, 600, 12)

fig, ax = plt.subplots(figsize=(9, 4))
ax.bar(range(12), values, color='steelblue')
ax.set_xticks(range(12))
ax.set_xticklabels(months, rotation=45, ha='right', fontsize=10)
ax.set_ylabel('Revenue')
plt.tight_layout()
plt.close()

Форматирование значений делений

Используйте форматтеры matplotlib.ticker, чтобы отображать значения делений в удобном для чтения виде. FuncFormatter принимает функцию, которая получает значение деления и возвращает отформатированную строку. Распространённые варианты: разделитель тысяч, символ валюты, знак процента и экспоненциальная запись. Примените форматтер с помощью ax.yaxis.set_major_formatter(formatter).

from matplotlib.ticker import FuncFormatter

def millions_fmt(x, pos):
    return f'${x/1e6:.1f}M'

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(['Q1', 'Q2', 'Q3', 'Q4'], [1.2e6, 1.8e6, 2.1e6, 1.9e6], color='steelblue')
ax.yaxis.set_major_formatter(FuncFormatter(millions_fmt))
ax.set_title('Quarterly Revenue')
ax.set_ylabel('Revenue')
plt.tight_layout()
plt.close()

Легенды с ax.legend()

Вызовите ax.legend(), чтобы отобразить легенду для всех элементов графика, у которых задан параметр label. Настройте её с помощью loc (положение, например 'upper right' или 'lower left'), ncol (количество столбцов), framealpha (прозрачность рамки) и fontsize. Чтобы разместить легенду за пределами области графика, используйте bbox_to_anchor вместе с loc.

fig, ax = plt.subplots(figsize=(7, 4))
for region, color in [('East','steelblue'),('West','coral'),('North','green')]:
    ax.plot(range(12), np.random.randint(100, 400, 12),
            marker='o', label=region, color=color)

ax.legend(loc='upper right', ncol=1, framealpha=0.8, fontsize=10)
ax.set_title('Monthly Sales by Region')
plt.close()

Добавление текстовых аннотаций

ax.annotate(text, xy=(x_point, y_point), xytext=(x_text, y_text), arrowprops=...) добавляет текстовую подпись с необязательной стрелкой, указывающей на определённую точку данных. Используйте это, чтобы выделить максимальные значения, аномалии или важные события на графике. Словарь arrowprops управляет стилем стрелки: arrowstyle='->' задаёт простую стрелку.

y_vals = np.array([120, 180, 310, 250, 420, 380, 290])
x_vals = np.arange(len(y_vals))
peak_idx = np.argmax(y_vals)

fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x_vals, y_vals, 'o-', color='steelblue')
ax.annotate(f'Peak: {y_vals[peak_idx]}',
            xy=(peak_idx, y_vals[peak_idx]),
            xytext=(peak_idx - 2, y_vals[peak_idx] + 30),
            arrowprops={'arrowstyle': '->', 'color': 'red'},
            fontsize=10, color='red')
plt.close()

Добавление горизонтальных и вертикальных опорных линий

ax.axhline(y_value) проводит горизонтальную линию по всей ширине области Axes на указанном значении y. ax.axvline(x_value) проводит вертикальную линию. Обе функции принимают параметры color, linestyle и linewidth. Опорные линии часто используют для обозначения целевых значений, порогов или дат событий на графиках временных рядов.

fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(range(10), np.random.randint(100, 400, 10), 'o-', color='steelblue')

# Target line
ax.axhline(y=250, color='red', linestyle='--', lw=1.5, label='Target')

# Event line
ax.axvline(x=5, color='orange', linestyle=':', lw=1.5, label='Campaign start')

ax.legend()
ax.set_title('Revenue vs Target')
plt.close()

Стилизация с помощью тем

Matplotlib включает несколько встроенных таблиц стилей, которые меняют общий вид всех рисунков без изменения кода: 'seaborn-v0_8-whitegrid', 'fivethirtyeight', 'ggplot', 'bmh' и другие. Примените стиль с помощью plt.style.use('style_name') в начале скрипта. Используйте plt.style.context('style_name') как менеджер контекста, чтобы применять стиль только внутри определённого блока.

# Apply a style globally
plt.style.use('seaborn-v0_8-whitegrid')
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(range(10), np.random.randn(10).cumsum())
ax.set_title('Seaborn Whitegrid Style')
plt.close()

# Reset to default
plt.rcdefaults()

Сохранение рисунков с помощью savefig()

fig.savefig('filename.png') сохраняет рисунок в файл. Основные параметры: dpi (точек на дюйм — используйте 150 для экрана и 300 для печати), bbox_inches='tight' (предотвращает обрезание подписей) и format (определяется по расширению или задаётся явно). Распространённые форматы: '.png' (растровый, подходит для веб-страниц), '.pdf' (векторный, подходит для печати), '.svg' (векторный, редактируется в Illustrator).

fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(range(10), np.random.randn(10), 'o-')
ax.set_title('Export Example')
ax.set_xlabel('Step')
ax.set_ylabel('Value')

# Save as PNG (screen quality)
fig.savefig('/tmp/chart_screen.png', dpi=150, bbox_inches='tight')

# Save as PDF (print quality)
fig.savefig('/tmp/chart_print.pdf', dpi=300, bbox_inches='tight')

plt.close()
print('Figures saved.')

Полный пример: оформленный график для отчёта

Ниже приведён полный рабочий процесс, объединяющий все методы из этого урока: оформленный график временного ряда с подписями осей, отформатированными делениями оси y, горизонтальной целевой линией, аннотацией на пике и экспортом в PNG высокого разрешения. Именно такой подход следует использовать для любого графика, который помещается в отчёт или панель мониторинга.

from matplotlib.ticker import FuncFormatter

fig, ax = plt.subplots(figsize=(9, 5))
months = list(range(1, 13))
revenue = [120, 145, 132, 160, 175, 190, 210, 185, 220, 200, 240, 260]
peak = max(revenue)
peak_idx = revenue.index(peak)

ax.plot(months, revenue, 'o-', color='steelblue', lw=2, markersize=6)
ax.axhline(y=180, color='red', ls='--', lw=1.2, label='Target: $180K')
ax.annotate(f'Peak ${peak}K', xy=(peak_idx+1, peak),
            xytext=(peak_idx-1.5, peak+15),
            arrowprops={'arrowstyle': '->'}, fontsize=9)
ax.set_xticks(months)
ax.set_xticklabels(['Jan','Feb','Mar','Apr','May','Jun',
                    'Jul','Aug','Sep','Oct','Nov','Dec'], rotation=45, ha='right')
ax.yaxis.set_major_formatter(FuncFormatter(lambda x,p: f'${x:.0f}K'))
ax.set_title('2024 Monthly Revenue vs Target', fontsize=13, fontweight='bold')
ax.set_ylabel('Revenue')
ax.legend()
plt.tight_layout()
plt.close()

Быстрая проверка

Проверьте, насколько хорошо Вы поняли работу с подписями, заголовками и сохранением рисунков из этого урока.

Итоги урока

В этом уроке Вы узнали, что set_xlabel()/set_ylabel()/set_title() добавляют информативный текст; FuncFormatter форматирует значения делений как денежные суммы или проценты; ax.annotate() добавляет текстовые подписи со стрелками, выделяющие ключевые точки данных; axhline()/axvline() проводят опорные линии; а fig.savefig() с параметрами dpi и bbox_inches='tight' создаёт экспортированные материалы издательского качества. На этом завершается курс «Основы Matplotlib». Далее Вы изучите Seaborn для статистических графиков.

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Подписи, заголовки и сохранение графиков» бесплатный?

Да — полный текст урока «Подписи, заголовки и сохранение графиков» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Подписи, заголовки и сохранение графиков»?

Добавляйте подписи осей, заголовок, легенду и форматирование делений, а затем сохраняйте графики публикационного качества с помощью savefig(). Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Подписи, заголовки и сохранение графиков»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Архитектура Figure и Axes
  2. Линейные графики и диаграммы рассеяния
  3. Столбчатые диаграммы и гистограммы
  4. Подписи, заголовки и сохранение графиков
← Назад к Pandas & NumPy Academy