D3.js предоставляет набор шкал для преобразования данных в визуальные координаты, среди которых логарифмический масштаб занимает особое место при работе с величинами, изменяющимися на несколько порядков. Логарифмическая шкала позволяет отображать экспоненциальные и сильно скошенные распределения так, чтобы визуальная интерпретация оставалась читаемой и информативной.
Логарифмический масштаб основан на преобразовании значений через логарифм:
[ y = _b(x)]
где (b) — основание логарифма (обычно 10 или e), а (x) — исходное значение данных.
В контексте визуализации это означает, что равные расстояния на оси соответствуют не равным приращениям данных, а равным отношениям.
Ключевой эффект:
Логарифмическая шкала создаётся через:
const scale = d3.scaleLog();
Далее задаются:
Пример:
const scale = d3.scaleLog()
.domain([1, 1000])
.range([0, 300]);
Это означает:
Логарифмическая шкала имеет строгие ограничения:
Причина: логарифм от 0 и отрицательных чисел не определён в вещественной области
Пример корректного диапазона:
.domain([0.1, 1000])
Пример некорректного диапазона:
.domain([-10, 100]) // ошибка логики шкалы
Основание влияет на визуальное восприятие распределения:
const scale10 = d3.scaleLog().base(10);
const scaleE = d3.scaleLog().base(Math.E);
Практические особенности:
Функция преобразования:
scale(10); // возвращает позицию в range
Пример:
const scale = d3.scaleLog()
.domain([1, 100])
.range([0, 500]);
scale(1); // 0
scale(10); // ~250
scale(100); // 500
Интерполяция происходит через:
[ f(x) = ]
где (a) и (b) — границы domain.
Логарифмическая шкала поддерживает обратное преобразование:
scale.invert(250);
Это позволяет:
Логарифмический масштаб используется для:
Пример данных:
[1, 5, 10, 100, 1000, 10000]
На линейной шкале:
На логарифмической:
Для визуализации шкалы используется ось:
const xAxis = d3.axisBottom(scale);
D3 автоматически форматирует логарифмические деления:
Дополнительная настройка:
d3.axisBottom(scale)
.ticks(10, ",.1s");
Логарифмическая шкала имеет особенности генерации ticks:
scale.ticks(5);
Особенности:
Можно задать формат:
d3.axisBottom(scale)
.tickFormat(d3.format(".0s"));
При значениях близких к нулю логарифмическая шкала становится чувствительной:
Практическая особенность:
Логарифмическая шкала может ограничивать выход за domain:
scale.clamp(true);
Поведение:
Это полезно для:
Линейная шкала:
[ y = ax + b]
Логарифмическая:
[ y = (x)]
Различие поведения:
Пример:
Обе ситуации равны на логарифмической шкале, но различны на линейной.
Логарифмический масштаб применяется в случаях:
В D3 возможно комбинирование:
const x = d3.scaleLog().domain([1, 1000]).range([0, width]);
const y = d3.scaleLinear().domain([0, 100]).range([height, 0]);
Типичный сценарий:
При использовании логарифмической шкалы в интерактивных графиках важно учитывать:
Пример:
svg.on("click", (event) => {
const xValue = scale.invert(d3.pointer(event)[0]);
});
Логарифмическая шкала:
Основная нагрузка возникает не в scaleLog, а в рендеринге DOM/SVG элементов.
Логарифмическая шкала фактически выполняет роль “выпрямления” экспоненциальных кривых:
Это делает возможным анализ данных, которые в линейной шкале выглядят “сплющенными” или перегруженными в одной области.