Простыми словами:
масштаб
преобразует числа из одного интервала (называемого областью или доменом) в числа из другого интервала (называемого диапазоном). Как использовать функции масштабирования D3, в этой главе мы сначала разделим их на категории с точки зрения входных и выходных данных, а затем подробно рассмотримLinear
линейный,Power
степенной,log
логарифмический,Time
временной,Sequential
последовательный,Quantize
квантизационный,Quantile
квантильный,Threshold
пороговый,Ordinal
порядковый. Функции масштабирования D3 являются JavaScript функциями:
вход
(обычно число, дата или категория)выход
(например, координата, цвет, длина или радиус)
Они обычно используются для преобразования значений данных в визуальные переменные (например, положение, длина и цвет).Например, предположим, что у вас есть некоторые данные:
[ 0, 2, 3, 5, 7, 5, 9, 10 ]
Вы можете создать функцию масштабирования Scale
следующим образом:
var myScale = d3.scaleLinear()
.domain([0, 10])
.range([0, 600]);
D3 создает функцию, которая принимает входные данные от 0 до 10 (область) и отображает их в диапазоне от 0 до 600 (диапазон).
Вы можете использовать myScale
для вычисления положения на основе данных:
myScale(0); // возвращает 0
myScale(2); // возвращает 120
myScale(3); // возвращает 180
...
myScale(10); // возвращает 600
/image/image--20220816152438874.png)
Попробуйте редактировать пример выше в Codepen ### Типы масштабирования D3 D3 имеет около 12 различных типов масштабирования (например,
Linear
,power
,sequential
,ordinal(band,Point)
и т. д.), которые можно разделить на три группы с точки зрения входных и выходных данных:
Непрерывные данные обычно являются числовыми данными, но также включают время и даты. Дискретные данные имеют определенное количество значений (например, двенадцать месяцев в году). Давайте рассмотрим несколько примеров использования этих типов:
Давайте рассмотрим функции масштабирования, которые отображают непрерывный входной домен
в непрерывный выходной диапазон
.
ScaleLinear
может быть самым часто используемым типом масштабирования, так как они являются наиболее подходящими для преобразования значений данных в положение и длину. Они используют линейную функцию! [image-20220816153946785](. /image/image--20220816153946785.png) для интерполяции в пределах domain
и range
.
var linearScale = d3.scaleLinear()
.domain([0, 10])
.range([0, 600]);
linearScale(0); // возвращает 0
linearScale(5); // возвращает 300
```linearScale(10); // возвращает 600
Линейные масштабные функции обычно используются для преобразования значений данных в положения и длины. Они полезны при создании столбчатых, линейных и многих других типов графиков. Область вывода также может быть определена как цвет:
var linearScale = d3.scaleLinear()
.domain([0, 10])
.range(['желтый', 'красный']);
linearScale(0); // возвращает "rgb(255, 255, 0)"
linearScale(5); // возвращает "rgb(255, 128, 0)"
linearScale(10); // возвращает "rgb(255, 0, 0)"
Это полезно для визуализации, таких как изолинии, и также можно рассмотреть scaleQuantize
, scaleQuantile
, scaleThreshold
.
scaleSqrt
масштаб используется для определения размера круга по площади (а не по радиусу).
var sqrtScale = d3.scaleSqrt()
.domain([0, 100])
.range([0, 30]);
sqrtScale(0); // возвращает 0
sqrtScale(50); // возвращает 21.21...
sqrtScale(100); // возвращает 30
scalePow
является более общим вариантом scaleSqrt
. Этот масштаб использует функцию степеней
$$
y = mx^k + b
$$
для интерполяции. Значение экспоненты k
задается с помощью .exponent()
:
var powerScale = d3.scalePow()
.exponent(2)
.domain([0, 1000])
.range([0, 300]);
var myData = [100, 200, 300, 400, 1000];
// powerScale[item]
scaleLog
использует логарифмическую функцию
$$
y = m \log(x) + b
$$Для интерполяции, что может быть полезно, когда данные имеют экспоненциальное свойство.
var logScale = d3.scaleLog()
.domain([10, 100000])
.range([0, 600]);
logScale(10); // возвращает 0
logScale(100); // возвращает 150
logScale(1000); // возвращает 300
logScale(100000); // возвращает 600
scaleTime
похож на scaleLinear
, за исключением того, что область представляет собой массив дат. (Очень полезно при работе с временными рядами данных.)
timeScale = d3.scaleTime()
.domain([new Date(2016, 0, 1), new Date(2017, 0, 1)])
.range([0, 1000]);
#### scaleSequential
`scaleSequential` используется для отображения **`domain` заданного диапазона** на предопределенный **`interpolator` интерполятор**. (Интерполятор — это функция, которая принимает входные данные от 0 до 1 и возвращает интерполяцию между двумя числами, цветами, строками и т. д.)
D3 предоставляет множество предопределенных интерполяторов, включая множество цветных интерполяторов. Например, вы можете использовать `d3.interpolateRainbow` для создания известного радужного цвета (красивый! ):
var sequentialScale = d3.scaleSequential() .domain([0, 100]) .interpolator(d3.interpolateRainbow); sequentialScale(0); // возвращает 'rgb(110, 64, 170)' sequentialScale(50); // возвращает 'rgb(175, 240, 91)' sequentialScale(100); // возвращает 'rgb(110, 64, 170)'
--------------------------
#### invert
Этот метод позволяет вам определить **входное** значение функции масштабирования при заданном **выходном** значении `.invert()`:
```
let linearScale = d3.scaleLinear()
.domain([0, 10])
.range([0, 100]);
linearScale.invert(50); // возвращает 5
linearScale.invert(100); // возвращает 10
```
#### clamp
По умолчанию, когда входное значение выходит за пределы `domain(диапазона)`, выходное значение все равно будет вычислено, но не будет учитываться `range`.
Например:
```
var x = d3.scaleLinear()
.domain([10, 130])
.range([0, 960]);
x(-10); // -160, за пределами диапазона
x.invert(-160); // -10, за пределами диапазона
```
Вы можете использовать метод `.clamp(true)` для **ограничения функции масштабирования**, чтобы входные значения оставались в пределах диапазона:
```
x.clamp(true);
x(-10); // 0, ограничен диапазоном
x.invert(-160); // 10, ограничен диапазоном
```
Также можно отключить его с помощью `.clamp(false)`.
#### Множественные сегменты
Домен и диапазон для `scaleLinear`, `scalePow` и `scaleSqrt` обычно состоят из двух значений, но если вы предоставите три или более значений, функция масштабирования будет разделена на несколько сегментов:
```
var linearScale = d3.scaleLinear()
.domain([-10, 0, 10])
.range(['red', '#ddd', 'blue']);
linearScale(-10); // возвращает "rgb(255, 0, 0)"
linearScale(0); // возвращает "rgb(221, 221, 221)"
linearScale(5); // возвращает "rgb(111, 111, 238)"
```
-------------------------------------------------
``` ### непрерывный вход и дискретный выход (вход непрерывен, выход дискретен)
#### scaleQuantize
`scaleQuantize` принимает непрерывный вход и возвращает несколько дискретных значений, определенных диапазоном.
```javascript
var quantizeScale = d3.scaleQuantize()
.domain([0, 100])
.range(['blue', 'orange', 'green', 'pink']);
quantizeScale(10); // возвращает 'blue'
quantizeScale(30); // возвращает 'orange'
quantizeScale(90); // возвращает 'pink'
```
Каждое значение диапазона отображается в блоки одинакового размера в домене, поэтому в приведенном выше примере:
- 0 ≤ *v* < 25 отображается как `blue`
- 25 ≤ *v* < 50 отображается как `orange`
- 50 ≤ *v* < 75 отображается как `green`
- 75 ≤ *v* < 100 отображается как `pink`
где *v* — это входное значение.

> [Попробуйте редактировать приведенный выше пример в Codepen](https://codepen.io/wantnocode/pen/RwMqpRY)
#### scaleQuantile
`scaleQuantile` отображает непрерывные числовые входы в дискретные значения. `domain(домен)` определяется **массивом чисел**:
```javascript
var myData = [0, 5, 7, 10, 20, 30, 35, 40, 60, 62, 65, 70, 80, 90, 100];
var quantileScale = d3.scaleQuantile()
.domain(myData)
.range(['blue', 'orange', 'green']);
```

> [Попробуйте редактировать приведенный выше пример в Codepen](https://codepen.io/wantnocode/pen/yLKQMVe)
Элементы массива `domain` делятся на *n* групп одинакового размера, где *n* — это количество значений в `range`.
Таким образом, в приведенном выше примере массив домена делится на 3 группы, где:
- Первые 5 значений отображаются как `blue` - Следующие 5 значений отображаются как `оранжевый`
- Последние 5 значений отображаются как `зелёный`
Разделы домена можно получить с помощью `. quantiles()`:
```javascript
quantileScale. quantiles(); // возвращает [26, 63, . . . ]
```
Возвращаются значения квантилей. Если `range` содержит *n* дискретных значений, то возвращаемый массив будет содержать *n* - 1 значение. В первом квантиле учитываются значения, меньшие первого порога; значения, большие или равные первому порогу, но меньшие второго порога, учитываются во втором квантиле и так далее.
Проще говоря, наименьшие 25% данных отображаются в `range[0]`, следующие 25% данных отображаются в `range[1]` и так далее.
### Дискретный вход и дискретный выход (вход и выход не являются непрерывными)
#### scaleOrdinal
`scaleOrdinal` имеет дискретный `domain` и `range`. `domain` массив указывает на возможные входные значения, а `range` массив указывает на выходные значения. Если `range` массив короче `domain` массива, то `range` массив будет повторяться.
```
var myData = ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек']
var ordinalScale = d3. scaleOrdinal()
. domain(myData)
. range(['синий', 'красный', 'розовый']);
ordinalScale('Янв'); // возвращает 'синий'
ordinalScale('Фев'); // возвращает 'красный'
ordinalScale('Мар'); // возвращает 'розовый'
ordinalScale('Апр'); // возвращает 'синий'; // повтор
```

> [Попробуйте редактировать пример выше в Codepen](https://codepen.io/wantnocode/pen/MWVzpVJ)По умолчанию, если значение, не входящее в `domain`, используется в качестве входного, `Scale` будет неявно добавлять это значение в `domain`:
```
ordinalScale('Понедельник'); // возвращает 'черный';
```
Если это поведение не требуется, можно использовать `.unknown()`:
```
ordinalScale.unknown('Не месяц');
ordinalScale('Вторник'); // возвращает 'Не месяц'
```
#### scaleBand
`scaleBand` используется для создания диаграммы столбцов и помогает определить геометрию столбцов, учитывая заполнение между ними. `domain` задается как набор значений (значения каждого столбца), а `range` обычно задается минимальным и максимальным значениями (например, общей шириной диаграммы столбцов).
На самом деле `scaleBand` разделяет `range` на `n` `bar` (где `n` — количество значений в массиве `domain`), и вычисляет положение и ширину каждого `bar`, учитывая любое указанное заполнение.
```
var bandScale = d3.scaleBand()
.domain(['Пн', 'Вт', 'Ср', 'Чт', 'Пт'])
.range([0, 200]);
bandScale('Пн'); // 0
bandScale('Вт'); // 40
bandScale('Пт'); // 160
```
Можно использовать метод `.bandwidth()` для доступа к ширине каждого бара:
```
bandScale.bandwidth(); // 40
```
Можно настроить два типа заполнения:
- `paddingInner` (как процент ширины бара) — количество заполнения между барами
- `paddingOuter` (как процент ширины бара) — количество заполнения перед первым баром и после последнего бара
Добавим внутреннее заполнение в пример выше:
```
bandScale.paddingInner(0.05);
bandScale.bandWidth(); // 38.38
bandScale('Пн'); // 0
bandScale('Вт'); // 40.4
```Тогда будет создана такая диаграмма столбцов:

> [Попробуйте редактировать пример выше в Codepen](https://codepen.io/wantnocode/pen/mdxQWGg)
#### `scalePoint`
`scalePoint` создает набор точек, равномерно распределенных в заданном диапазоне (равномерно распределенных).
```js
var pointScale = d3.scalePoint()
.domain(['Mon', 'Tue', 'Wed', 'Thu', 'Fri'])
.range([0, 500]);
pointScale('Mon'); // возвращает 0
pointScale('Tue'); // возвращает 125
pointScale('Fri'); // возвращает 500
```

Между точками можно получить расстояние с помощью метода `.step()`:
```
pointScale.step(); // возвращает 125
```
Внешний заполнитель можно указать как отношение заполнителя к расстоянию между точками. Например, чтобы сделать внешний заполнитель равным одной четвертой расстояния между точками, используйте значение 0.25:
```
pointScale.padding(0.25);
pointScale('Mon'); // возвращает 27.77...
pointScale.step(); // возвращает 111.11...
```
> [Попробуйте редактировать пример на Codepen](https://codepen.io/wantnocode/pen/YzaRZdB)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )