Масштабы в D3.js представляют собой функцию преобразования входного
домена данных в выходной диапазон визуальных значений. Базовая форма
масштабов определяется как отображение значений данных (domain) в
координаты пикселей, цвета, размеры и другие визуальные параметры
(range). При этом поведение шкалы может быть существенно изменено с
помощью тонких настроек, среди которых ключевыми являются
clamp, nice и tickFormat.
Параметр clamp управляет поведением шкалы при выходе
входных значений за пределы заданного домена.
При значении clamp(false) (по умолчанию) масштаб
продолжает экстраполяцию: значения вне домена преобразуются линейно,
даже если результат выходит за пределы диапазона.
При clamp(true) выходные значения жёстко ограничиваются
границами диапазона.
const scale = d3.scaleLinear()
.domain([0, 100])
.range([0, 500])
.clamp(true);
scale(-20); // 0
scale(50); // 250
scale(120); // 500
Поведение clamp критично в визуализациях, где выход за пределы диапазона может приводить к некорректной отрисовке элементов, например, при позиционировании графических объектов внутри SVG или canvas-контейнеров.
Особенности применения:
Метод nice используется для автоматической корректировки
домена шкалы к более «читаемым» значениям. Он расширяет границы domain
так, чтобы они попадали на удобные деления.
const scale = d3.scaleLinear()
.domain([2.3, 97.8])
.range([0, 500])
.nice();
После применения nice() домен может быть преобразован,
например, в [0, 100], если это соответствует округлённым
границам шкалы.
Механизм работы:
Использование nice особенно важно для осей координат,
где требуется визуальная симметрия и читаемость делений.
Типовые сценарии:
Метод tickFormat задаёт функцию форматирования значений
тиков (делений шкалы). Он влияет исключительно на визуальное
представление, не изменяя сами данные.
const scale = d3.scaleLinear()
.domain([0, 1])
.range([0, 500])
.tickFormat(d3.format(".0%"));
В этом случае значения 0.1, 0.5,
0.9 будут отображаться как 10%,
50%, 90%.
Функция форматирования обычно строится на базе
d3.format, позволяющей задавать шаблоны:
.2f — фиксированное количество знаков после
запятой.0% — процентное отображение.2s — SI-префиксы (k, M, G),.2f — разделение тысячныхПример:
const scale = d3.scaleLinear()
.domain([0, 1000000])
.range([0, 500])
.tickFormat(d3.format(".2s"));
Отображение может стать:
0 → 0250000 → 250k1000000 → 1MtickFormat не влияет на:
Он влияет только на слой отображения, что делает его ключевым инструментом для адаптации графиков под разные аудитории и контексты.
Совместное использование этих методов позволяет управлять шкалой на трёх уровнях: вычислительном, структурном и визуальном.
clamp(true) фиксирует поведение при выходе за domain,
обеспечивая предсказуемость визуального результата. Это особенно важно
при динамических данных, где диапазон может изменяться.
nice() корректирует domain до визуально согласованных
значений, что напрямую влияет на генерацию осей через
axisBottom или axisLeft.
tickFormat формирует окончательный слой отображения
чисел, не затрагивая вычисления и геометрию.
const x = d3.scaleLinear()
.domain([0, 120])
.range([0, width])
.clamp(true);
Используется при необходимости строго ограничить координаты по оси X.
const y = d3.scaleLinear()
.domain([3.7, 98.2])
.range([height, 0])
.nice();
Применяется для построения аккуратных осей без ручной настройки границ.
const yAxis = d3.axisLeft(y)
.tickFormat(d3.format(".1f"));
Используется для приведения чисел к единому виду при отображении шкал.
Хотя clamp, nice и tickFormat
не оказывают значительного влияния на вычислительную сложность, они
определяют структуру взаимодействия между данными и визуальным
слоем.
clamp стабилизирует геометриюnice формирует предсказуемые осиtickFormat оптимизирует восприятие данныхВ сложных визуализациях их комбинирование становится частью архитектуры шкалирования, влияющей на читаемость графиков, точность восприятия и устойчивость интерфейса при изменении данных.