Логарифмическая шкала: что это, как читать график и когда она нужна
Логарифмическая шкала — ось, где равные отрезки означают равные отношения. Как читать такой график, когда он нужен и когда вредит, как построить в Excel, Python и SQL.
Содержание статьи
Логарифмическая шкала — это ось, на которой равные расстояния означают равные отношения (в 10 раз, в 2 раза), тогда как на привычной линейной — равные разности. Отметка числа x ставится на расстоянии log x от единицы, поэтому на оси от 1 до 1 000 число 10 стоит на трети длины, 100 — на двух третях, 500 — на 90%. Такую ось включают, когда значения различаются на порядки или когда важен рост в процентах, а не в штуках. Ниже — как читать такой график, как построить его в Excel, Python и SQL и где он вводит в заблуждение.
Что такое логарифмическая шкала простыми словами
На линейной оси шаг между делениями — одна и та же прибавка: 0, 250, 500, 750. На логарифмической — одно и то же умножение: 1, 10, 100, 1 000. От 1 до 10 столько же, сколько от 10 до 100: значение выросло в десять раз.
Положение отметки задаёт логарифм — показатель степени, в которую нужно возвести основание, чтобы получить число: p(x) = log x / log b. Для 500 это log₁₀ 500 = 2,70: число лежит в 2,7 шага «в десять раз» от единицы. Вся ось от 1 до 1 000 — три таких шага, значит, 500 стоит на 2,70 / 3 = 90% длины. На линейной оси от 0 до 1 000 оно стоит посередине, а 10 и 100 прижаты к левому краю: 1% и 10% длины.
Отсюда главное свойство: расстояние между отметками зависит только от их отношения. От 2 до 4 столько же, сколько от 50 до 100 и от 3 000 до 6 000, — это удвоение.
p(x) = log x / log bb — основание шкалы (10, 2 или e), p — число шагов «в b раз» от единицы. Расстояние между a и c равно log(c / a) / log b.
import numpy as np
marks = np.array([10, 100, 500])
print(marks / 1000) # линейная ось от 0 до 1 000
print(np.round(np.log10(marks) / np.log10(1000), 3)) # логарифмическая ось от 1 до 1 000
print(np.round(np.log2(marks) / np.log2(1000), 3)) # основание 2: положение то же
print(np.round(np.log10([200, 300, 500]) - 2, 2), round(10 ** 2.5)) # внутри 100–1 000 и серединаКак читать график с логарифмической осью
В учебной базе сервиса «Маяк» есть оплаты за 12 полных недель, с 1 июня по 23 августа 2026 года. Недельная выручка выросла с 67 до 3 893 долларов — в 58 раз. На линейной оси первая неделя занимает 1,7% высоты и сливается с нулём, а ряд выглядит ровным подъёмом: в девяти шагах из одиннадцати прирост лежит между 200 и 600 долларами.
На логарифмической оси тот же ряд — крутой взлёт и пологая линия после него. Высота шага между соседними точками равна логарифму множителя. Со второй недели на третью выручка удвоилась, шаг — 0,30 декады (декада — отрезок, на котором значение вырастает в десять раз). С восьмой на девятую она выросла на 22%, шаг — 0,08.
Промежуточные деления стоят неравномерно. Между 100 и 1 000 отметка 200 находится на 30% отрезка, 300 — на 48%, 500 — на 70%. Середина отрезка — 316, тогда как привычка к линейке подсказывает 550. Значения между подписанными делениями на глаз не читаются: включайте вспомогательную сетку (в matplotlib — ax.grid(which="minor")).
WITH weekly AS (
SELECT CAST(DATE_TRUNC('week', paid_at) AS date) AS week_start, SUM(amount) AS revenue
FROM payments
WHERE paid_at < DATE '2026-08-24'
GROUP BY DATE_TRUNC('week', paid_at)
)
SELECT week_start, revenue,
ROUND(revenue / LAG(revenue) OVER (ORDER BY week_start), 2) AS growth,
ROUND(LOG10(revenue), 2) AS log10_revenue,
ROUND(LOG10(revenue) - LOG10(LAG(revenue) OVER (ORDER BY week_start)), 2) AS step_up
FROM weekly
ORDER BY week_start;- Одинаковый подъём — одинаковый процент. Шаг в 0,30 декады — удвоение на любом уровне: с 548 до 1 102 долларов или с 5 000 до 10 000.
- Прямая — постоянный темп. Ряд, который каждую неделю прибавляет 10%, на логарифмической оси даёт прямую, на линейной — кривую, уходящую вверх (экспоненту).
- Линия загибается вниз — темп падает, даже если прирост в долларах прежний.
Как по наклону линии узнать темп роста
Наклон линии на логарифмической оси задаёт темп: это логарифм множителя за один шаг. Числом темп получают так: по точкам (номер недели; ln выручки) методом наименьших квадратов проводят прямую — она проходит ближе всего к точкам — и берут экспоненту её наклона: темп = exp(наклон) − 1.
Для недельной выручки по всем 12 точкам выходит 29,4% в неделю, но ряд на одну прямую не ложится. По первым четырём неделям темп — 178% в неделю, по последним восьми — 11,1%. График на логарифмической оси показывает это без расчёта: первые три шага линия идёт круто, дальше — полого.
Из темпа получается срок удвоения: ln 2 / ln(1 + темп). При 10% за шаг значение удваивается за 7,3 шага.
темп = exp(k) − 1k — наклон прямой ln y = a + k · t. Если отложен десятичный логарифм, темп = 10^k − 1. Срок удвоения = ln 2 / ln(1 + темп).
import matplotlib.pyplot as plt
import numpy as np
weeks = np.arange(1, 13)
revenue = np.array([67, 548, 1102, 1594, 1806, 2098, 2364, 2774, 3372, 3623, 3112, 3893])
fig, (linear, logarithmic) = plt.subplots(1, 2, figsize=(10, 4))
linear.plot(weeks, revenue, marker="o")
logarithmic.plot(weeks, revenue, marker="o")
logarithmic.set_yscale("log") # то же: logarithmic.semilogy(weeks, revenue)
logarithmic.set_ylim(10, 10_000)
def rate(x, y): # темп за шаг: экспонента наклона по логарифмам минус 1
return np.exp(np.polyfit(x, np.log(y), 1)[0]) - 1
print(f"{rate(weeks, revenue):.1%} {rate(weeks[:4], revenue[:4]):.0%} {rate(weeks[4:], revenue[4:]):.1%}")Чем полулогарифмический график отличается от двойного логарифмического
На полулогарифмическом графике логарифмическая одна ось, обычно Y; по X идёт время в обычном масштабе. Прямую на нём даёт экспонента y = a · bᵗ — рост с постоянным темпом. На двойном логарифмическом (log–log) логарифмические обе оси, и прямую даёт степенная зависимость y = a · xᵏ; наклон прямой равен показателю k. Точки (1; 1), (10; 100), (100; 10 000) лежат на параболе y = x², а в двойных логарифмических координатах — на прямой с наклоном 2.
DAU — число пользователей хотя бы с одним событием за день — в учебной базе вырос с 32 в первый день до 530 в последний из 90 полных (максимум — 586, 28 августа; 30 августа выгрузка обрывается днём и не считается). На полулогарифмическом графике точки идут дугой: прямая объясняет 84% разброса ln DAU. В двойных логарифмических координатах, где по X номер дня, — 97%, наклон 0,65. Вывод отсюда один: рост не экспоненциальный, темп в процентах падает. Степенным законом это его не делает: DAU прибавляет почти поровну в день (прямая на линейных осях даёт R² 0,96), а такой ряд, начавшийся с малого значения, в двойных логарифмических координатах всегда близок к прямой. Наклон зависит от точки отсчёта: если считать дни с 11-го, а не с 1-го, он равен 1,03 вместо 0,65.
Когда логарифмическая шкала нужна
Первый случай уже показан: один ряд вырос в десятки раз. Второй — на графике два ряда разного масштаба. Число активных за неделю пользователей (WAU) в учебной базе растёт от 196 до 2 045, число оплат за неделю — от 3 до 157. На линейной оси до 2 200 линия оплат занимает нижние 7% высоты.
На логарифмической оси видны обе линии, и работает ещё одно правило: расстояние между линиями по вертикали — это отношение рядов. С третьей недели линии идут почти параллельно: на 100 активных приходится от 6,5 до 8,8 оплаты, темп по наклону — 14,9% в неделю у аудитории и 13,2% у оплат. В первые две недели оплаты догоняли аудиторию (первый шаг — ×7,3 против ×1,9): первая оплата приходит через 3–20 дней после регистрации.
Привычная замена — две оси Y — хуже: подбором диапазонов линии можно сблизить, развести или пересечь в любом месте. Логарифмическая ось одна на оба ряда, и наклоны на ней сравнимы.
| Вопрос | Линейная ось | Логарифмическая ось |
|---|---|---|
| Какой ряд даёт прямую | с постоянным приростом в штуках | с постоянным темпом в процентах |
| Выручка, 67 → 3 893 доллара | первая неделя — 1,7% высоты | виден перелом темпа: 178% → 11,1% в неделю |
| DAU в августе | +4,2 пользователя в день | +0,87% в день, линия почти горизонтальна |
- Значения различаются на порядки — как выручка, выросшая в 58 раз.
- Вопрос об относительных изменениях: на сколько процентов, во сколько раз, чей темп выше.
- Распределение с длинным хвостом, где основная масса значений теряется рядом с редкими большими.
Как выглядит скошенное распределение на логарифмических интервалах
Третий случай — гистограмма. Возьмём паузы между соседними событиями одного пользователя: в базе 35 341 событие 4 613 пользователей, то есть 30 728 пауз. Самая короткая — 35 минут, самая длинная — 1 391 час (58 суток): разброс в три с лишним порядка.
Гистограмма с равными интервалами по 100 часов почти бесполезна: в первый столбец попадает 72% пауз, остальное — хвост. Интервалы, растущие в геометрической прогрессии (0,5–1 час, 1–2, 2–4 и дальше), показывают устройство данных. 18% пауз короче 8 часов — это действия в течение одного дня. Пауз длиннее 6 и короче 18 часов нет вовсе: в учебной базе действия одного дня укладываются в шесть часов, а следующее приходится уже на другой день. В живых данных на этом месте будет провал, а не пустота. Остальные — возвращения на следующий день и позже.
В SQL такие интервалы задаёт целая часть логарифма: FLOOR(LOG10(hours)) раскладывает значения по порядкам. Корзин получается пять, от −1 до 3, и 53,5% пауз попало в одну: от 10 до 100 часов. Для рисунка это грубо, поэтому взяты удвоения.
У такой гистограммы своя ловушка: интервалы разной ширины, последний шире первого в 2 048 раз. Высота столбца показывает число пауз в интервале, плотность нужно считать отдельно. Столбец 64–128 часов (5 825 пауз) ниже столбца 16–32 часа (8 282) в 1,4 раза, а по плотности разрыв почти шестикратный: 91 пауза на час ширины против 518.
WITH pauses AS (
SELECT EXTRACT(epoch FROM event_time
- LAG(event_time) OVER (PARTITION BY user_id ORDER BY event_time)) / 3600.0 AS hours
FROM events
)
SELECT FLOOR(LOG10(hours)) AS power_of_10,
ROUND(CAST(MIN(hours) AS numeric), 1) AS shortest,
ROUND(CAST(MAX(hours) AS numeric), 1) AS longest,
COUNT(*) AS pauses,
ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS percent
FROM pauses
WHERE hours IS NOT NULL
GROUP BY FLOOR(LOG10(hours))
ORDER BY power_of_10;Где логарифмическая шкала обманывает
Замедление выглядит как остановка. В июне DAU прибавлял в среднем 6,7 пользователя в день, в августе — 4,2: в 1,6 раза меньше. В процентах это 5,29% и 0,87% в день — падение в шесть раз; срок удвоения вырос с 13 до 80 дней. На логарифмической оси август почти горизонтален. Зритель, не привыкший к такой оси, прочтёт это как «рост закончился», хотя DAU за месяц вырос больше чем на сто человек.
Высота на графике не равна вкладу в штуках. Июнь (DAU с 32 до 240) занимает 69% высоты логарифмической оси от 32 до 586, а в пользователях это 38% пути от минимума к максимуму. С выручкой так же: первый шаг, с 67 до 548 долларов (+481), выше всего остального пути от 548 до 3 893 (+3 345), потому что ×8,2 больше, чем ×7,1.
Одинаковый наклон — одинаковый темп, но разный прирост. Аудитория и оплаты с третьей недели идут почти параллельно, а прибавили 1 464 пользователя и 109 оплат. Когда вопрос про абсолютные числа — сколько денег заложить в бюджет, — нужна линейная ось.
Столбчатая диаграмма теряет смысл. Длина столбца должна быть пропорциональна величине, но на логарифмической оси нет нуля, от которого её отмерять. За всю выгрузку тариф basic принёс 13 414 долларов, team — 5 538 (третий тариф, pro, опустим): разница в 2,42 раза. Если ось начинается с 1 000, столбцы различаются в 1,52 раза, со 100 — в 1,22, с 1 — в 1,10. matplotlib начинает ось чуть ниже меньшего столбца — с 5 298, и столбец team выходит в 21 раз короче. Для логарифмической оси берите точки или линию.
Середина на глаз — среднее геометрическое. Посередине между 67 и 3 893 на логарифмической оси стоит 511, корень из произведения; арифметическая середина, 1 980, — на 83% пути. По той же причине среднее логарифмов — это логарифм среднего геометрического.
WITH daily AS (
SELECT CAST(event_time AS date) AS day, COUNT(DISTINCT user_id) AS dau
FROM events
WHERE event_time < TIMESTAMP '2026-08-30'
GROUP BY CAST(event_time AS date)
),
numbered AS (
SELECT day, dau, ROW_NUMBER() OVER (ORDER BY day) AS day_no
FROM daily
)
SELECT CAST(DATE_TRUNC('month', day) AS date) AS month,
COUNT(*) AS days,
ROUND(CAST(REGR_SLOPE(dau, day_no) AS numeric), 1) AS users_per_day,
ROUND(CAST(100 * (EXP(REGR_SLOPE(LN(dau), day_no)) - 1) AS numeric), 2) AS percent_per_day
FROM numbered
GROUP BY DATE_TRUNC('month', day)
ORDER BY month;Что делать с нулями и отрицательными значениями
Логарифм нуля не определён: каждый шаг вниз делит значение на основание, и до нуля не дойти. В учебной базе за 90 полных дней, с 1 июня по 29 августа, оплат не было в семи. PostgreSQL и DuckDB на LOG10(0) останавливают запрос ошибкой. По справке Excel, логарифмическая шкала не может использоваться для отрицательных значений или нуля. matplotlib ошибки не выдаст: нулевая точка уйдёт за нижний край оси, и линия нырнёт вниз.
Первый приём — прибавить единицу и строить log(x + 1): ноль встаёт в начало оси. Но картинка теперь зависит от единиц измерения. В долларах отрезок от нуля до самого слабого дня с оплатами (19 долларов) занимает 45% оси, в центах — 67%. По той же причине среднее геометрическое с поправкой «+1» даёт для дневной выручки 193,71 доллара, а если считать в центах и перевести обратно — 135,51 доллара.
Второй приём — шкала symlog: около нуля она линейная, дальше логарифмическая. Нули и отрицательные значения на ней помещаются, но порог перехода выбираете вы: при пороге 10 долларов тот же отрезок занимает 46% оси, при пороге 100 — 11%.
Надёжнее сказать о нулях отдельно. Покажите долю нулевых дней (7 из 90) и постройте логарифмическую ось по остальным либо укрупните шаг: недель без оплат в базе нет. Для величин, которые бывают отрицательными (прибыль, изменение к прошлому периоду), логарифмическая ось не подходит.
import numpy as np
smallest, largest = 19, 771 # самый слабый и самый сильный день с оплатами, доллары
for unit, name in ((1, "доллары"), (100, "центы")):
zero_to_smallest = np.log10(smallest * unit + 1) # ноль стоит в log10(0 + 1) = 0
axis = np.log10(largest * unit + 1)
print(name, round(zero_to_smallest, 2), round(axis, 2), f"{zero_to_smallest / axis:.0%}")Как построить логарифмическую шкалу в Excel, Python, SQL и BI
Excel. Выделите вертикальную ось диаграммы, откройте «Формат оси» → «Параметры оси» и установите флажок «Логарифмическая шкала» — так он назван в справке Microsoft. Логарифм в ячейке считает =LOG(число; основание); если основание опущено, оно равно 10.
Python. В matplotlib ось переключает plt.yscale("log") или ax.set_yscale("log"); plt.semilogy(x, y) сразу рисует полулогарифмический график, plt.loglog(x, y) — двойной логарифмический, plt.yscale("symlog", linthresh=10) — ось с линейным участком у нуля. В pandas достаточно df.plot(logy=True). Для гистограммы задайте границы через np.geomspace(0.5, 2048, 13) и добавьте plt.xscale("log").
SQL. Логарифм в запросе нужен для корзин гистограммы и для темпа через REGR_SLOPE(LN(y), t). В PostgreSQL и DuckDB LN — натуральный логарифм, LOG и LOG10 — десятичный. В MySQL, SQL Server и ClickHouse LOG(x) с одним аргументом — натуральный. LOG10 есть во всех пяти движках и везде десятичный. LN работает везде, кроме SQL Server: там натуральный логарифм — только LOG(x), а основание задаётся вторым аргументом, LOG(x, 2). LOG2 есть в DuckDB, в PostgreSQL 14 его нет, а LOG(2, x) там считает в numeric: значение типа double precision сначала приведите — LOG(2, CAST(x AS numeric)).
Порядок величины считайте через LOG10. Запись FLOOR(LN(1000) / LN(10)) в обоих движках возвращает 2: логарифмы хранятся с округлением, и частное равно 2,9999999999999996.
BI. В Yandex DataLens в настройках оси есть параметр «Тип оси» со значениями «Линейная» и «Логарифмическая»; он доступен, если поле на оси имеет тип «Дробное число», — целое поле сначала приведите к дробному. В Metabase у линейных и столбчатых диаграмм и диаграмм с областями шкала оси Y выбирается из трёх вариантов: Linear, Power, Log.
SELECT LOG(1000) AS log_x,
LOG10(1000) AS log10_x,
ROUND(CAST(LN(1000) AS numeric), 3) AS ln_x,
FLOOR(LOG10(1000)) AS power_by_log10,
FLOOR(LN(1000) / LN(10)) AS power_by_ln;Какое основание выбрать: 10, 2 или e
Основание меняет подписи делений, форма графика остаётся прежней. Логарифмы по разным основаниям отличаются постоянным множителем, и точки остаются на местах: 500 — это 2,70 шага по основанию 10, 8,97 шага по основанию 2 и 6,21 по основанию e, и во всех трёх случаях 90% оси от 1 до 1 000.
Основание 10 удобно, когда значения различаются на порядки. Порядок величины в расчётах — целая часть десятичного логарифма: у 548 это 2, у 3 893 — 3. Основание 2 удобно при мелких шагах: деления читаются как удвоения. Натуральный логарифм нужен для расчётов: при малых изменениях разность ln почти равна относительному приросту (ln 1,05 = 0,049).
Логарифмические шкалы встречаются и вне графиков. Децибел — десять десятичных логарифмов отношения мощностей: плюс 10 дБ — мощность в десять раз больше, плюс 3 дБ — примерно вдвое. Магнитуду землетрясения в 1935 году ввёл Чарльз Рихтер: по описанию Геологической службы США, каждая единица — десятикратный рост амплитуды колебаний на сейсмограмме. Водородный показатель pH — десятичный логарифм активности ионов водорода со знаком минус.
Частые вопросы
Как сделать логарифмическую шкалу в Excel по горизонтальной оси? Постройте точечную диаграмму: у неё обе оси числовые. У графика горизонтальная ось — ось категорий: набор параметров шкалы у неё, по справке Microsoft, ограничен, и перевести горизонтальную ось в логарифмическую шкалу справка предлагает в точечной диаграмме.
Можно ли прологарифмировать данные вместо оси? Форма графика получится та же, но подписи будут в логарифмах: 3,59 вместо 3 893 долларов. Логарифмическая ось удобнее читателю, столбец с логарифмом — расчётам: наклону, корзинам, среднему.
Что значит прямая линия на логарифмическом графике? На полулогарифмическом — постоянный темп изменения в процентах: вверх — рост, вниз — падение. На двойном логарифмическом — степенную зависимость.
Когда логарифмическую шкалу лучше не включать? Когда читатель с ней не знаком и объяснить некому, когда в данных много нулей, когда нужны абсолютные разности и когда значения различаются меньше чем в несколько раз: тогда она ничего не добавит.
Что попробовать на учебной базе
Те же запросы можно выполнить в песочнице симулятора SQL-аналитика на этой базе. Первое упражнение: посчитайте темп роста WAU по наклону. Соберите недельный ряд из таблицы events (COUNT(DISTINCT user_id) по DATE_TRUNC('week', event_time) с условием event_time < TIMESTAMP '2026-08-24'), пронумеруйте недели через ROW_NUMBER() и возьмите EXP(REGR_SLOPE(LN(wau), week_no)) - 1. Должно получиться 21,1% в неделю, а десятичные логарифмы первой и последней недели — 2,29 и 3,31.
Второе: разложите пользователей по числу событий на корзины-удвоения — FLOOR(LOG10(n) / LOG10(2)), где n — COUNT(*) по user_id (на границах корзин проверьте результат: частное логарифмов может недотянуть до целого; в DuckDB есть LOG2). Корзин пять, от 0 (одно событие) до 4 (от 16 событий): 73, 485, 1 821, 2 144 и 90 пользователей. Здесь логарифмические интервалы не нужны: значения лежат от 1 до 22, и 86% пользователей попали в две корзины из пяти.
Материалы по теме

Математическое ожидание: что это, формула и примеры
Математическое ожидание простыми словами: среднее, к которому результат сходится в долгую. Формула, пример на кубике, расчёт в SQL и Python, свойства и ловушки.

Коэффициент вариации: формула, расчёт и как читать
Коэффициент вариации — стандартное отклонение в процентах от среднего. Формула, пример на пяти числах, расчёт в SQL, Python и Excel, порог 33% для НМЦК и ловушки.

Линейная регрессия простыми словами: уравнение, наклон и R²
Что такое регрессия и линейная регрессия: уравнение y = a + b·x, наклон, свободный член и R². Пример на пяти точках, расчёт в SQL, Python и Excel, остатки, прогноз и ловушки.