Функции d3.min и d3.max предназначены для
вычисления минимального и максимального значений в массиве данных. Они
работают как с простыми числовыми массивами, так и со структурами
объектов при использовании accessor-функции.
Базовый вариант применения:
d3.min([3, 7, 2, 9, 5]); // 2
d3.max([3, 7, 2, 9, 5]); // 9
При работе с объектами данных используется второй аргумент — функция доступа к значению:
const data = [
{ value: 10 },
{ value: 25 },
{ value: 7 }
];
d3.min(data, d => d.value); // 7
d3.max(data, d => d.value); // 25
При вычислениях игнорируются значения undefined и
null, однако NaN может привести к
некорректному результату, если попадает в вычисляемую выборку. Поэтому
на практике часто выполняется предварительная очистка данных.
При пустом массиве результатом становится undefined.
Функция d3.extent объединяет поведение
d3.min и d3.max, возвращая сразу диапазон
значений в виде массива из двух элементов:
d3.extent([3, 7, 2, 9, 5]); // [2, 9]
Для объектов применяется accessor-функция:
const data = [
{ age: 18 },
{ age: 42 },
{ age: 27 }
];
d3.extent(data, d => d.age); // [18, 42]
Результат при отсутствии данных или при отсутствии валидных значений
— [undefined, undefined].
d3.extent часто используется при настройке шкал, когда
требуется автоматически подстроить домен под данные:
const xScale = d3.scaleLinear()
.domain(d3.extent(data, d => d.value))
.range([0, 500]);
Такой подход устраняет необходимость вручную вычислять границы.
Функция d3.mean вычисляет среднее арифметическое
значений массива. Формально вычисление определяется как:
{x} = _{i=1}^{n} x_i
Простейший пример:
d3.mean([10, 20, 30]); // 20
Для объектов используется accessor:
const data = [
{ score: 10 },
{ score: 20 },
{ score: 30 }
];
d3.mean(data, d => d.score); // 20
Значения null, undefined и NaN
игнорируются. Если после фильтрации не остается числовых значений,
результатом становится undefined.
Среднее чувствительно к выбросам. Например, набор
[1, 1, 1, 100] даёт среднее 25.75, что не отражает типичное
значение распределения.
Функция d3.median возвращает медианное значение, то есть
центральный элемент упорядоченного набора данных. При чётном количестве
элементов вычисляется среднее двух центральных значений.
Для нечетного количества элементов:
d3.median([1, 3, 5]); // 3
Для чётного количества:
d3.median([1, 3, 5, 7]); // 4
Для объектов:
const data = [
{ value: 10 },
{ value: 50 },
{ value: 30 }
];
d3.median(data, d => d.value); // 30
Медиана значительно менее чувствительна к экстремальным значениям по
сравнению со средним. Для набора [1, 2, 3, 1000]:
Такое различие делает медиану предпочтительной для асимметричных распределений.
d3.min / d3.max — поиск границ
диапазонаd3.extent — компактное получение обеих границd3.mean — характеристика центра распределенияd3.median — устойчивый центр распределенияВсе функции:
null и undefinedundefined при отсутствии валидных
значенийТипичный сценарий в D3 связан с массивами структурированных данных. Унифицированный паттерн использования accessor-функций обеспечивает одинаковый стиль вычислений:
const dataset = [
{ year: 2010, value: 12 },
{ year: 2011, value: 25 },
{ year: 2012, value: 18 }
];
d3.min(dataset, d => d.value);
d3.max(dataset, d => d.value);
d3.mean(dataset, d => d.value);
d3.median(dataset, d => d.value);
d3.extent(dataset, d => d.value);
Такой подход делает возможным независимость вычислительной логики от структуры данных.
Агрегирующие функции часто применяются как промежуточный этап перед визуализацией:
В связке с масштабами D3 они формируют основу автоматической адаптации визуализаций к данным, обеспечивая согласованность представления при изменении входных наборов.