Как работает d3.scale.quantile?

В чем смысл этого утверждения?

quantize = d3.scale.quantile().domain([0, 15]).range(d3.range(9));

Я видел, что домен:

0 - 0
1 - 15

диапазон от 0 до 8 и квантование .quantiles

0 - 1.6
1 - 3.3
2 - 4.9
3 - 6.6
4 - 8.3
5 - 9.9
6 -11.6
7 -13.3

Как рассчитываются значения для квантования. Я попытался вызвать quantize(2), но результат был 1. Как работает quantile?

Ответы

Ответ 1

Мотивация квантильной шкалы состоит в том, чтобы получить классы, которые представляют фактическое распределение значений в наборе данных. Поэтому необходимо предоставить его при построении с полным списком значений. Затем шкала разбивает входную область (определяемую этими значениями) на интервалы (квантили), так что примерно одинаковое количество значений попадает в каждый из интервалов.

Из документации:

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

Следовательно, при указании домена мы передаем в масштабе весь список значений:

var scale = d3.scale.quantile()
  .domain([1, 1, 2, 3, 2, 3, 16])
  .range(['blue', 'white', 'red']);

Если мы тогда запустим:

scale.quantiles()

Он выведет [2, 3], что означает, что наша совокупность значений была разделена на эти три подмножества, представленные "синим", "белым" и "красным" соответственно:

[1, 1] [2, 2] [3, 3, 16]

Обратите внимание, что этой шкалы следует избегать, когда в данных, которые вы хотите показать, есть выбросы. В приведенном выше примере 16 - выброс, попадающий в верхний квантиль. Ему присваивается тот же класс, что и 3, что, вероятно, не является желаемым поведением:

scale(3)   // will output "red"
scale(16)  // will output "red"

Ответ 2

Я бы порекомендовал читать документацию по количественному масштабу, особенно, что на quantize.quantiles()

Но в основном, d3 видит, что в этом диапазоне есть 9 значений в выходном диапазоне, поэтому он создает 9 квантилей на основе набора данных 2 значений: [0, 15].
Это приводит к значениям quantize.quantiles(), которые вы указываете в своем вопросе: [1.6, 3.3,.., 13.3], они представляют границы квантилей - все, что меньше 1.6, будет отображаться на первый элемент вывода диапазон (в этом случае нуль). Все, что меньше 3,3 и больше 1,6, будет отображаться во второй элемент выходного диапазона (один). Следовательно, квантовать (2) = один, как и ожидалось.