Работа с числовыми данными: d3.min, d3.max, d3.extent, d3.mean, d3.median

Функции 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.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: среднее арифметическое

Функция 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 возвращает медианное значение, то есть центральный элемент упорядоченного набора данных. При чётном количестве элементов вычисляется среднее двух центральных значений.

Для нечетного количества элементов:

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]:

  • среднее: 251.5
  • медиана: 2.5

Такое различие делает медиану предпочтительной для асимметричных распределений.


Сравнение функций агрегирования

Поведение и назначение

  • d3.min / d3.max — поиск границ диапазона
  • d3.extent — компактное получение обеих границ
  • d3.mean — характеристика центра распределения
  • d3.median — устойчивый центр распределения

Обработка данных

Все функции:

  • игнорируют null и undefined
  • поддерживают accessor-функции
  • возвращают undefined при отсутствии валидных значений

Работа с массивами объектов

Типичный сценарий в 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 они формируют основу автоматической адаптации визуализаций к данным, обеспечивая согласованность представления при изменении входных наборов.