Масштабирование точек в библиотеке D3.js применяется для равномерного
размещения дискретных значений вдоль непрерывной оси. Механизм
d3.scalePoint() предназначен для преобразования набора
категориальных данных в набор равномерно распределённых координат, где
каждая категория получает строго одну позицию без ширины интервала.
Такой тип шкалы используется в ситуациях, когда требуется выстроить элементы по оси X или Y с одинаковыми промежутками: подписи категорий, метки временных интервалов, узлы диаграмм, элементы легенды, дискретные состояния.
d3.scalePoint() относится к семейству порядковых шкал и
работает с дискретным доменом:
Ключевая особенность заключается в том, что каждая категория отображается в одну координату, без интервалов между значениями как у линейных шкал.
Базовая инициализация:
const scale = d3.scalePoint()
.domain(["A", "B", "C", "D"])
.range([0, 300]);
После этого:
scale("A"); // 0
scale("B"); // 100
scale("C"); // 200
scale("D"); // 300
Фактические значения зависят от количества элементов и параметра
padding, который изменяет распределение точек внутри
диапазона.
Расположение точек вычисляется через равномерное разбиение диапазона.
Пусть:
n — количество элементов в домене[a, b] — диапазон шкалыp — padding (от 0 до 1)Тогда шаг между точками:
[ step = ]
Начальное смещение:
[ offset = step p]
Положение каждой точки:
[ x_i = a + offset + i step]
где i — индекс элемента в домене.
Такое распределение гарантирует симметричное размещение с возможностью добавления внутренних отступов.
Частая ошибка при выборе шкалы — использование
scalePoint() вместо scaleBand().
scalePoint():
scaleBand():
padding управляет расстоянием между крайними точками и
границами диапазона, а также плотностью распределения.
const scale = d3.scalePoint()
.domain(["Jan", "Feb", "Mar", "Apr"])
.range([0, 400])
.padding(0.5);
Поведение:
padding = 0 — точки начинают и заканчиваются строго на
границах диапазонаpadding > 0 — добавляется дополнительное
пространство слева и справаconst width = 500;
const scaleX = d3.scalePoint()
.domain(["Mon", "Tue", "Wed", "Thu", "Fri"])
.range([0, width])
.padding(0.2);
const axis = d3.axisBottom(scaleX);
Визуально это приводит к равномерному распределению дней недели вдоль оси X.
const svg = d3.select("svg");
const data = ["A", "B", "C", "D"];
const scale = d3.scalePoint()
.domain(data)
.range([50, 450])
.padding(0.3);
svg.selectAll("circle")
.data(data)
.enter()
.append("circle")
.attr("cx", d => scale(d))
.attr("cy", 100)
.attr("r", 6);
Здесь каждая категория преобразуется в координату cx,
образуя равномерную линию точек.
Изменение массива домена полностью перестраивает распределение:
scale.domain(["A", "B", "C"]);
Особенности:
В отличие от линейных шкал, порядок домена критически важен.
.domain(["C", "A", "B"])
Элементы будут размещены строго в указанной последовательности, независимо от их «логического» порядка.
При передаче значения, отсутствующего в домене:
scale("Z"); // undefined
Результат всегда undefined, так как шкала не выполняет
интерполяцию для категорий вне домена.
Шкала поддерживает создание независимых копий:
const scale2 = scale.copy();
Это позволяет:
Шкала может включать округление координат:
const scale = d3.scalePoint()
.domain(["A", "B", "C"])
.range([0, 300])
.round(true);
При включении:
scalePoint() часто комбинируется с:
d3.scaleLinear() — для числовых значенийd3.scaleTime() — для временных осейd3.scaleOrdinal() — для цветовой кодировки
категорийПример комбинирования:
const x = d3.scalePoint()
.domain(categories)
.range([0, width]);
const y = d3.scaleLinear()
.domain([0, 100])
.range([height, 0]);
scalePoint() обладает высокой производительностью:
Основная нагрузка возникает только при изменении домена или диапазона.
Приводит к отсутствию ширины у элементов и неправильной визуализации столбцов.
.domain(["A", "A", "B"])
Результат непредсказуем, так как шкала предполагает уникальность категорий.
Если диапазон слишком мал, точки могут накладываться визуально из-за округления.
При пустом домене:
.domain([])
Шкала не может вычислить распределение, и любые обращения возвращают
undefined.
Точечная шкала формирует:
Это можно интерпретировать как дискретную сетку, наложенную на непрерывное пространство.