ОК, мы можем начать изучение с использованием как с теми же данными, чтобы увидеть различия (я использую d3 v4), представьте себе, у нас есть данные ниже с использованием ordinal
и linear
весы:
const data = [1, 2, 3, 4, 5];
const scaleLinear = d3.scaleLinear()
.domain([0, Math.max(...data)]).range([1, 100]);
const scaleOrdinal = d3.scaleOrdinal()
.domain(data).range(['one', 'two', 'three', 'four', 'five']);
Теперь мы начинаем называть их, чтобы увидеть результат:
scaleLinear(1); //20
scaleOrdinal(1); //one
scaleLinear(2); //40
scaleOrdinal(2); //two
scaleLinear(5); //100
scaleOrdinal(5); //five
Посмотрите на функции и результаты, которые мы получаем, как вы видите в порядковых один отобразят данные в наш диапазон, в то время как в линейных мы растянуть диапазон, поэтому в этих случаях, например, scaleLinear (1) возвратит 20 ... наш домен не более 100 и 100 разделить на 5 равно 20, так scaleLinear (1) является и scaleLinear (2) является .. .
Но, как вы видите, scaleOrdinal (1) является карта для массива в диапазоне, поэтому он равен один и scaleOrdinal (2) он равен два ...
Так что, как вы можете использовать эти весы, scaleLinear полезно для многих вещей, в том числе присутствует масштаб на странице, но scaleOrdinal более полезный для получения данных для того, что, как это описано в документации:
# d3.scaleLinear() <>
Создает новую непрерывную шкалу с единичной областью [0, 1], диапазон блока [0, 1], интерполятор по умолчанию и зажим отключен. Линейные весы являются хорошим выбором по умолчанию для непрерывных количественных данных , поскольку они сохраняют пропорциональные различия. Каждое значение диапазона y может быть выражено как функция значения домена x: y = mx + b.
d3.scaleOrdinal ([диапазон]) <>
Создает новый порядковый масштаб с пустой области и указанного диапазона. Если диапазон не указан, по умолчанию используется пустой массив; порядковый масштаб всегда возвращается неопределенным до тех пор, пока не будет определен пустой пробел .
Кроме того, это хороший пример из d3 в глубину с использованием как порядковые и линейных весов в то же время:
var myData = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
var linearScale = d3.scaleLinear()
.domain([0, 11])
.range([0, 600]);
var ordinalScale = d3.scaleOrdinal()
.domain(myData)
.range(['black', '#ccc', '#ccc']);
d3.select('#wrapper')
.selectAll('text')
.data(myData)
.enter()
.append('text')
.attr('x', function(d, i) {
return linearScale(i);
})
.text(function(d) {
return d;
})
.style('fill', function(d) {
return ordinalScale(d);
});
body {
font-family: "Helvetica Neue", Helvetica, sans-serif;
font-size: 14px;
color: #333;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script>
<svg width="800" height="60">
\t <g id="wrapper" transform="translate(100, 40)">
\t </g>
</svg>
Линейная шкала будет интерполировать между входными значениями, тогда как порядковой шкалы не будет. –
@ LarsKotthoff, пожалуйста, укажите пример? – Bruce
На самом деле есть пример этого в документах 'linear (0.5)'. –