В библиотеке D3.js масштабирование данных реализуется через набор
функций, преобразующих числовые значения в визуальные представления:
цвет, координаты, размеры. Расходящийся масштаб
(diverging scale) предназначен для отображения данных, у
которых есть средняя точка (нейтральное значение),
относительно которой значения расходятся в противоположные стороны.
Типичные сценарии применения:
Расходящийся масштаб интерпретирует числовую шкалу как симметричное пространство вокруг центрального значения.
Основная идея:
В отличие от линейных или логарифмических масштабов, здесь важна визуальная симметрия относительно центра, а не равномерность интервалов.
d3.scaleDiverging(interpolator)
Где:
interpolator — функция интерполяции, определяющая
переход между цветами или значениями;Простейший пример:
const scale = d3.scaleDiverging(d3.interpolateRdBu);
Расходящийся масштаб работает через параметр t в
диапазоне [0, 1].
Интерпретация:
t = 0 → край «отрицательной» стороныt = 0.5 → центрt = 1 → край «положительной» стороныИспользуемые интерполяторы:
d3.interpolateRdBud3.interpolatePiYGd3.interpolateRdYlBuПо умолчанию масштаб использует домен:
[0, 1]
Однако в реальных задачах почти всегда задаётся трёхточечный домен:
d3.scaleDiverging()
.domain([-100, 0, 100])
Интерпретация:
-100 → край отрицательных значений0 → центр100 → край положительных значенийЦентральное значение не обязано быть нулём:
d3.scaleDiverging()
.domain([10, 50, 200])
Масштаб выполняет нормализацию входного значения в интервал
[0, 1] с учётом центра:
[0, 0.5][0.5, 1]Формально:
Это позволяет добиться визуально сбалансированного перехода.
Наиболее частое применение — цветовое кодирование отклонений.
Пример тепловой карты:
const color = d3.scaleDiverging()
.domain([-1, 0, 1])
.interpolator(d3.interpolateRdBu);
Использование:
color(-0.8); // синий оттенок
color(0); // нейтральный цвет
color(0.8); // красный оттенок
Такой подход широко применяется в:
const temperatureScale = d3.scaleDiverging()
.domain([-30, 0, 30])
.interpolator(d3.interpolateRdYlBu);
Каждое значение температуры отображается относительно нуля как центра.
const errorScale = d3.scaleDiverging()
.domain([-1, 0, 1])
.interpolator(d3.interpolatePuOr);
| Характеристика | Линейный масштаб | Расходящийся масштаб |
|---|---|---|
| Центр | не учитывается | обязателен |
| Симметрия | отсутствует | ключевая особенность |
| Интерполяция | равномерная | двухсторонняя |
| Основное применение | оси, координаты | отклонения, разности |
Можно задавать собственную функцию:
const scale = d3.scaleDiverging(t => {
return d3.interpolateCool(t);
});
Или более сложный вариант:
const scale = d3.scaleDiverging(t => {
return t < 0.5
? d3.interpolateBlues(t * 2)
: d3.interpolateReds((t - 0.5) * 2);
});
Это позволяет вручную контролировать поведение центра и контраст.
Если значение выходит за пределы домена, поведение определяется интерполятором:
Пример:
scale(-200); // крайнее левое значение
scale(200); // крайнее правое значение
Как и другие масштабы D3, расходящийся масштаб поддерживает инверсию:
scale.invert(value);
Это позволяет получить исходное числовое значение из визуального представления.
Расходящийся масштаб обычно интегрируется в:
d3.axis);Пример интеграции:
svg.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("fill", d => color(d.value));
Масштаб рассчитан на непрерывные значения, где:
Он плохо подходит для: