2025, Nov 02 01:16

База 2 в лог–лог графиках Matplotlib: куда исчезают мелкие деления и как вернуть читаемую сетку

Разбираем, почему при базе 2 в лог–лог графиках Matplotlib исчезают мелкие деления и сетка выглядит равномерной, и показываем, как настроить оси для читаемости.

Лог–лог графики хорошо сжимают порядки величин и выявляют мультипликативные зависимости. Но важна и эстетика: равномерно расположенные мелкие деления визуально подсказывают, что обе оси логарифмические. Если в Matplotlib сменить основание логарифма на 2, эти мелкие деления исчезают, и сетка выглядит равномерной. С данными всё в порядке, но читать такой график сложнее. Ниже — почему так происходит и как вернуть читаемую сетку, которая выглядит по‑логарифмически.

Воспроизведём настройку с основанием по умолчанию

Ниже фрагмент кода строит лог–лог график с настройками Matplotlib по умолчанию. В результате появляются привычные мелкие деления, которые делают логарифмическое масштабирование очевидным.

import numpy as np
import matplotlib.pyplot as plt
xvals = np.array([8, 16, 32, 64, 128, 256, 512, 1024])
yvals = np.array([2.412, 3.424, 5.074, 7.308, 11.444, 18.394, 30.644, 48.908])
log_base = 2  # заглушка для основания
fig_obj, ax_obj = plt.subplots(figsize=(8, 6))
ax_obj.plot(xvals, yvals, 'o--')
ax_obj.set_xscale('log')
ax_obj.set_yscale('log')
ax_obj.set(title='loglog')
ax_obj.grid()
ax_obj.grid(which='minor', color='0.9')

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

Переход на основание 2 и исчезновение мелких делений

Теперь переключим обе оси на основание 2. Значения по-прежнему отображаются верно, но сетка лишается характерных логарифмических мелких делений, а интервалы выглядят равномерными.

import numpy as np
import matplotlib.pyplot as plt
xvals = np.array([8, 16, 32, 64, 128, 256, 512, 1024])
yvals = np.array([2.412, 3.424, 5.074, 7.308, 11.444, 18.394, 30.644, 48.908])
log_base = 2
fig_obj, ax_obj = plt.subplots(figsize=(8, 6))
ax_obj.plot(xvals, yvals, 'o--')
ax_obj.set_xscale('log', base=log_base)
ax_obj.set_yscale('log', base=log_base)
ax_obj.set(title='loglog')
ax_obj.grid()
ax_obj.grid(which='minor', color='0.9')

Альтернативы вроде использования ax.loglog(..., base=...) или ручного форматирования подписей делений не возвращают равномерно распределённые мелкие риски.

Почему это происходит

С основанием 10 вы получаете основные деления на 10, 100, 1000, ... и мелкие — на 20, 30, 40, .... С основанием 2 основные деления — это 2, 4, 8, 16, ... . Нет логичных позиций, чтобы разместить несколько мелких делений между основными.

В этом и дело. При основании 10 внутри каждого десятка естественно возникают подделения: 2×, 3×, …, 9×. При основании 2 основные деления уже приходятся на степени двойки, и очевидной многошаговой структуры между ними не остаётся. Поэтому Matplotlib не может расставить серию осмысленных мелких делений, которые выглядели бы «логарифмически».

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

Если важны внешняя выразительность и удобство чтения, берите логарифмические основания, дающие полезные подделения. Использование основания 8 по оси x и 4 по оси y формирует сетку, которая визуально ближе к графику с основанием 10 по умолчанию, при этом масштаб остаётся согласованным с диапазонами ваших данных.

import numpy as np
import matplotlib.pyplot as plt
xvals = np.array([8, 16, 32, 64, 128, 256, 512, 1024])
yvals = np.array([2.412, 3.424, 5.074, 7.308, 11.444, 18.394, 30.644, 48.908])
x_base_val = 8
y_base_val = 4
fig_obj, ax_obj = plt.subplots(figsize=(8, 6))
ax_obj.plot(xvals, yvals, 'o--')
ax_obj.set_xscale('log', base=x_base_val)
ax_obj.set_yscale('log', base=y_base_val)
ax_obj.set(title='loglog')
ax_obj.grid()
ax_obj.grid(which='minor', color='0.9')

Так сохраняется корректное логарифмическое масштабирование и возвращается наглядная сетка — благодаря основаниям, позволяющим интуитивно размещать деления.

Почему этот нюанс важен

В исследовательском анализе и отчётах восприятие направляет интерпретацию. Когда мелкие деления исчезают или выглядят равномерно, читатель может не заметить, что перед ним лог–лог диаграмма. Разумный выбор оснований делает структуру шкалы очевидной и снижает когнитивную нагрузку при сравнении наклонов и относительного роста.

Выводы

Читаемость лог–лог графиков определяется структурой делений. Если при переходе на основание 2 пропадают привычные мелкие риски, это не ошибка отрисовки, а следствие выбора основания. Подберите такие основания, чтобы на каждой оси были осмысленные подделения — в данном случае 8 для x и 4 для y — и вы сохраните сетку, которая сразу сообщает о логарифмической природе графика.

Статья основана на вопросе на StackOverflow от Igor Soares и ответе от Igor Soares.