Композиция фигуры: subplots, аннотации, единицы, легенда

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

Публикационная фигура — итоговый график для статьи: одна или несколько панелей (subplots) с подписями a/b/c, обязательными единицами на осях, аккуратной легендой и заданным разрешением (DPI), собранный скриптом.

Subplots: панели как абзацы

Сложный результат часто требует нескольких связанных графиков. Их объединяют в фигуру из панелей (subplots), подписанных буквами a, b, c — на них ссылаются в тексте («рис. 2b»). Панели выравнивают по сетке, делят общие оси, где уместно, и располагают в логическом порядке чтения. Это та же идея, что small multiples, но панели могут быть разными типами графиков, образующими единое повествование.

Единицы — это не опция

Самое частое и стыдное упущение — ось без единиц измерения. «Время» бессмысленно: секунды? часы? «Сигнал» — в чём, в милливольтах? Каждая ось обязана иметь подпись вида «величина, единица»: «Время, с», «Напряжение, мВ», «Концентрация, моль/л». Без единиц фигура научно непригодна — рецензент вернёт статью. То же касается чисел в подписях и аннотациях.

ЭлементОбязательноПример
Подпись оси Xвеличина + единицаВремя, с
Подпись оси Yвеличина + единицаСигнал, мВ
Легендаесли >1 серииконтроль / опыт
Подпись панелиесли >1 subplot(a), (b)
Шкала погрешностиесли есть оценки±SE, n=10

Аннотации направляют взгляд

Хорошая фигура «рассказывает», куда смотреть: стрелка к ключевому пику, заштрихованная область значимого интервала, вертикальная линия в момент события с подписью. Аннотации — это управление вниманием читателя, перевод фигуры из «вот данные» в «вот вывод». Но не переборщите: каждая аннотация должна нести смысл, иначе превращается в chartjunk.

LaTeX в подписях

Научные подписи часто содержат формулы, индексы, греческие буквы: $\sigma$, $R^2$, $\chi^2$, $E = mc^2$, $v_{\max}$. matplotlib умеет рендерить LaTeX в подписях — это связь с курсом по LaTeX. Вместо «sigma» и «v_max» пишите настоящие $\sigma$ и $v_{\max}$. Это делает фигуру профессиональной и однозначной.

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(7, 3))

ax1.plot(x, y)
ax1.set_xlabel(r"Время $t$, с")            # LaTeX в подписи
ax1.set_ylabel(r"Напряжение $U$, мВ")
ax1.set_title("(a)", loc="left")
ax1.annotate(r"$U_{\max}$", xy=(t_peak, u_peak),
             xytext=(t_peak+1, u_peak),
             arrowprops=dict(arrowstyle="->"))

ax2.scatter(a, b, s=12)
ax2.set_xlabel(r"Концентрация, моль/л")
ax2.set_ylabel(r"Отклик, отн. ед.")
ax2.set_title("(b)", loc="left")

fig.tight_layout()
fig.savefig("figure2.pdf", dpi=300, bbox_inches="tight")

Считаем размеры под журнал

Журналы задают ширину колонки (часто ~3,5 дюйма для одной колонки). При экспорте важно, чтобы размер шрифта на фигуре совпадал с текстом статьи. Прикинем итоговый размер в пикселях при заданном DPI.

width_in = 3.5     # ширина одной колонки, дюймы
height_in = 2.6
for dpi in (72, 150, 300, 600):
    px_w = int(width_in * dpi)
    px_h = int(height_in * dpi)
    print(f"DPI {dpi:3d}: {px_w} x {px_h} px")
print("для печати в журнале обычно нужно 300+ DPI")

Вывод:

DPI  72: 252 x 187 px
DPI 150: 525 x 390 px
DPI 300: 1050 x 780 px
DPI 600: 2100 x 1560 px
для печати в журнале обычно нужно 300+ DPI

Как работает под капотом

Размер фигуры задаётся в дюймах, а DPI (dots per inch) переводит их в пиксели для растровых форматов. Шрифт задаётся в пунктах (1 пункт = 1/72 дюйма), поэтому при фиксированном физическом размере фигуры шрифт получается одинаковым независимо от DPI — растёт лишь чёткость. Если же масштабировать готовую картинку в редакторе статьи, шрифт «поедет» относительно текста — поэтому фигуру задают сразу в нужном физическом размере.

Фигура как самодостаточный аргумент

Хорошая публикационная фигура понятна в отрыве от текста статьи. Рецензенты и читатели часто пролистывают работу по фигурам, и каждая должна сама объяснять, что показано: подпись (caption) сообщает, какие данные, сколько наблюдений, что означают планки погрешностей и звёздочки значимости; оси несут величины и единицы; легенда расшифровывает серии. Тест простой: закройте основной текст — понятен ли по одной фигуре с подписью её главный вывод? Если нет, фигуре чего-то не хватает.

Отсюда же требование к единообразию по всей статье. Если на рисунке 2 контрольная группа синяя, а опытная оранжевая, то и на рисунке 5 они должны быть теми же цветами — иначе читатель собьётся. Одинаковые шрифты, согласованные палитры, единый стиль подписей панелей превращают разрозненные графики в связный визуальный рассказ. Это та же дисциплина, что и в вёрстке текста: консистентность снижает когнитивную нагрузку и делает работу профессиональной.

Частые ошибки

  • Оси без единиц измерения — научно непригодная фигура.
  • Мелкий шрифт — после уменьшения до ширины колонки подписи нечитаемы; задавайте физический размер сразу.
  • Перегруз аннотациями — каждая должна нести смысл.
  • «sigma», «R2» текстом вместо $\sigma$, $R^2$ — непрофессионально; используйте LaTeX.

Итог

  • Фигура из subplots с подписями (a), (b) — связное повествование.
  • Единицы на осях обязательны всегда.
  • Аннотации направляют взгляд к выводу.
  • LaTeX в подписях; задавайте физический размер и DPI под журнал.
Проверьте себя
1. Что обязательно должно быть на каждой оси научной фигуры?
AСетка
BПодпись с величиной и единицей измерения (например «Время, с»)
CЛогарифмический масштаб
DЦветной фон
2. Зачем задавать физический размер фигуры (в дюймах) и DPI сразу в скрипте?
AДля красоты
BЧтобы шрифт совпал с текстом статьи и не «поехал» при масштабировании в редакторе
CЧтобы уменьшить число цветов
DЭто не нужно
3. Как лучше написать в подписи оси максимальную скорость?
Av_max текстом
BНастоящей формулой через LaTeX: $v_{\max}$
CVMAX заглавными
Dскорость макс