Функция scaleQuantile не выводит то, что я ожидаю

1

Я использую d3.scaleQuantile() чтобы получить определенный вывод чисел, диапазон d3.scaleQuantile() представляет собой массив из 8 чисел. я console.log() число в среднем положении диапазона, оно возвращает первый из этого диапазона. Код выглядит так:

var sortMass = d3.scaleQuantile()
    .domain([minMass, maxMass])
    .range([2000,4000,6000,8000,100000,120000])
console.log(sortMass(6500)) // here shows 2000

Если он возвращает 6000 или 8000, это имеет больше смысла. Но я не могу понять, почему выход 2000. Я прочитал документацию D3, но я все еще смущен. Кто-нибудь может объяснить, как d3.scaleQuantile() функция d3.scaleQuantile()?

Теги:
d3.js

1 ответ

1
Лучший ответ

Здесь есть недоразумение: в шкале D3, любой шкале, вы не передаете значение в пределах диапазона до шкалы. Вместо этого вы передаете значение внутри домена.

Итак, учитывая ваш масштаб...

var sortMass = d3.scaleQuantile()
  .domain([minMass, maxMass])
  .range([2000, 4000, 6000, 8000, 100000, 120000]);

... если вы передадите масштаб значение между minMass и maxMass, оно вернет соответствующее значение в диапазоне.

Вот базовая демонстрация, где я устанавливаю minMass в 0 и maxMass до 100:

var minMass = 0,
  maxMass = 100;
var sortMass = d3.scaleQuantile()
  .domain([minMass, maxMass])
  .range([2000, 4000, 6000, 8000, 100000, 120000]);

d3.range(0, 110, 10).forEach(function(d) {
  console.log("for the value " + d + ", the output is:" + sortMass(d))
})
<script src="https://d3js.org/d3.v4.min.js"></script>

Я подозреваю, что вы используете пределы диапазона как minMass и maxMass. Если это так, то это не сработает: домен делится на равные сегменты. Пусть это докажет:

var sortMass = d3.scaleQuantile()
  .domain([2000,120000])
  .range([2000, 4000, 6000, 8000, 100000, 120000]);

console.log(sortMass(6500))
<script src="https://d3js.org/d3.v4.min.js"></script>

И то, что 2000 на выходе, должным образом ожидается.

Поэтому, если мое предположение выше правильно, вы должны использовать пороговую шкалу:

var thresholds = [2000, 4000, 6000, 8000, 100000, 120000];
var sortMass = d3.scaleThreshold()
  .domain(thresholds)
  .range(thresholds);

console.log(sortMass(6500))
<script src="https://d3js.org/d3.v4.min.js"></script>

Заключение:

Итак, чтобы ответить на ваш вопрос:

Может ли кто-нибудь объяснить, как d3.scaleQuantile() функция d3.scaleQuantile()?

Для любой шкалы D3 вы передаете значение в соответствии с доменом, и масштаб вернет значение в соответствии с диапазоном. Помните:

  • Домен → - это вход.
  • Диапазон → - выход.
  • 1
    Большое спасибо Герардо! Ответ такой явный и очень полезный. Но, согласно вашему ответу, я все еще не понимаю, что вы сказали, что> домен разделен на равные сегменты. Я использовал пределы диапазона как minMass и maxMass. Не могли бы вы объяснить это немного подробнее, как домен разделен поровну и почему он не будет работать? Еще раз спасибо!
  • 1
    если вы используете от 2000 до 120000, у вас будет разрыв в 118000. Это делится на 6 примерно 20000. Таким образом, только после 20000 выходной диапазон будет следующим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню