В библиотеке Nivo тип переменной определяет способ интерпретации данных на оси графика. От выбранной шкалы зависит:
В Nivo наиболее распространены три типа шкал:
linearpointlogКаждый тип решает отдельный класс задач и применяется в разных сценариях визуализации.
Тип linear используется для непрерывных числовых
значений. Это базовая шкала для:
Шкала интерпретирует данные как непрерывный диапазон чисел.
Пример:
[
{ x: 0, y: 10 },
{ x: 1, y: 20 },
{ x: 2, y: 40 }
]
Каждое значение располагается пропорционально своему числовому положению.
Шкала вычисляет отношение между:
Если диапазон значений:
0 → 100
и ширина графика:
500px
то значение 50 окажется ровно посередине.
Наиболее часто шкала задаётся в свойствах:
xScale={{
type: 'linear'
}}
yScale={{
type: 'linear'
}}
Полный пример:
<ResponsiveLine
data={data}
xScale={{
type: 'linear',
min: 0,
max: 100
}}
yScale={{
type: 'linear',
min: 0,
max: 1000
}}
/>
Минимальное значение шкалы.
min: 0
Также допускаются:
min: 'auto'
При auto Nivo самостоятельно вычисляет минимум.
Максимальное значение.
max: 100
или:
max: 'auto'
Используется для накопительных графиков.
stacked: true
Применяется в:
Инвертирует направление шкалы.
reverse: true
Ось начинает отображаться в обратном порядке.
Пример:
100 → 0
Ограничивает значения границами шкалы.
clamp: true
Если значение выходит за диапазон, оно фиксируется на границе.
const data = [
{
id: 'CPU',
data: [
{ x: 0, y: 15 },
{ x: 1, y: 30 },
{ x: 2, y: 55 },
{ x: 3, y: 80 }
]
}
]
<ResponsiveLine
data={data}
xScale={{
type: 'linear'
}}
yScale={{
type: 'linear',
min: 0,
max: 100
}}
/>
Шкала подходит для:
| Тип данных | Подходит |
|---|---|
| Температура | Да |
| Доход | Да |
| Скорость | Да |
| Проценты | Да |
| Координаты | Да |
Если данные:
1
5
20
1000000
малые значения визуально “схлопываются”.
Это делает график нечитаемым.
В таких случаях используется log.
Ошибка:
xScale={{
type: 'linear'
}}
для данных:
x: 'January'
linear не работает со строковыми категориями.
Для этого нужен point.
Тип point применяется для дискретных категорий.
Примеры:
Шкала не вычисляет числовые интервалы.
Она размещает точки равномерно.
Если значения:
January
February
March
April
каждая точка получает одинаковое расстояние независимо от содержимого.
xScale={{
type: 'point'
}}
Пример:
const data = [
{
id: 'Sales',
data: [
{ x: 'Jan', y: 120 },
{ x: 'Feb', y: 210 },
{ x: 'Mar', y: 180 }
]
}
]
<ResponsiveLine
data={data}
xScale={{
type: 'point'
}}
yScale={{
type: 'linear'
}}
/>
Для шкалы:
A
B
C
между A и B нет значения
0.5.
Шкала работает исключительно с категориями.
Даже если данные логически отличаются:
2010
2020
2025
при point расстояние будет одинаковым.
point идеально подходит для строк.
x: 'Frontend'
<ResponsiveBar
data={[
{
country: 'USA',
users: 500
},
{
country: 'Germany',
users: 300
}
]}
keys={['users']}
indexBy="country"
/>
Внутри Nivo здесь используется категориальная шкала.
| Тип данных | Подходит |
|---|---|
| Месяцы | Да |
| Имена | Да |
| Категории | Да |
| Статусы | Да |
| Теги | Да |
Нельзя:
Ошибка:
x: 1
x: 2
x: 100
с point приводит к одинаковому расстоянию между
точками.
Хотя реальная разница отличается.
Шкала log используется для данных с огромным диапазоном
значений.
Примеры:
Данные:
1
10
100
1000
10000
На linear-графике первые значения почти не видны.
Логарифмическая шкала сжимает большие значения.
Вместо линейного расстояния используется логарифм.
Пример:
log10(1) = 0
log10(10) = 1
log10(100) = 2
Поэтому расстояния между:
1 → 10
10 → 100
100 → 1000
становятся одинаковыми.
yScale={{
type: 'log',
base: 10
}}
Полный пример:
<ResponsiveLine
data={data}
xScale={{
type: 'point'
}}
yScale={{
type: 'log',
base: 10,
min: 1,
max: 100000
}}
/>
Основание логарифма.
base: 10
Возможные варианты:
base: 2
base: Math.E
Минимум обязательно должен быть больше нуля.
Нельзя:
min: 0
Поскольку:
log(0)
не существует.
Максимальная граница шкалы.
max: 1000000
Логарифмическая шкала не поддерживает:
0Ошибка:
log(-5)
невозможна математически.
Неправильно:
[
{ x: 1, y: 0 },
{ x: 2, y: 100 }
]
Правильно:
[
{ x: 1, y: 1 },
{ x: 2, y: 100 }
]
const data = [
{
id: 'Requests',
data: [
{ x: '00:00', y: 1 },
{ x: '01:00', y: 10 },
{ x: '02:00', y: 100 },
{ x: '03:00', y: 1000 }
]
}
]
<ResponsiveLine
data={data}
xScale={{
type: 'point'
}}
yScale={{
type: 'log',
base: 10,
min: 1,
max: 1000
}}
/>
| Характеристика | linear | point | log |
|---|---|---|---|
| Тип данных | Числовой | Категориальный | Числовой |
| Интерполяция | Да | Нет | Да |
| Поддержка строк | Нет | Да | Нет |
| Большие диапазоны | Плохо | Не применимо | Отлично |
| Работа с 0 | Да | Да | Нет |
| Работа с отрицательными | Да | Да | Нет |
| Пропорциональность | Линейная | Равномерная | Логарифмическая |
Используется при:
Пример:
Температура
Продажи
CPU usage
Используется для:
Пример:
Monday
Tuesday
Wednesday
Используется при огромном диапазоне данных.
Пример:
1 → 1000000
Типичные сценарии:
На практике часто комбинируются разные типы.
Пример:
xScale={{
type: 'point'
}}
yScale={{
type: 'linear'
}}
или:
xScale={{
type: 'linear'
}}
yScale={{
type: 'log'
}}
Ошибка:
1
2
100
будут отображаться с одинаковыми интервалами.
Ошибка:
x: 'A'
linear ожидает числа.
Ошибка:
y: 0
вызывает некорректное построение графика.
Тип шкалы влияет на:
Неверно выбранная шкала способна полностью исказить смысл графика.
Nivo строится поверх библиотеки D3.
Шкалы основаны на:
d3.scaleLineard3.scalePointd3.scaleLogПоэтому поведение полностью соответствует экосистеме D3.
1
10
100
1000
На графике:
Те же данные:
1
10
100
1000
На графике:
Данные:
Low
Medium
High
Каждая категория занимает одинаковое пространство независимо от значения.
linear и point работают быстрее всего.
log требует дополнительных вычислений:
При больших объёмах данных это может влиять на производительность рендера.
xScale={{ type: 'point' }}
yScale={{ type: 'linear' }}
Самый распространённый вариант.
xScale={{ type: 'linear' }}
yScale={{ type: 'log', base: 10 }}
xScale={{ type: 'linear' }}
yScale={{
type: 'linear',
min: 'auto',
max: 'auto'
}}
Подходит по умолчанию для большинства задач.
Используется только для категориальных данных.
Применяется исключительно при действительно больших диапазонах значений.
Для обычной аналитики логарифмическая шкала ухудшает читаемость.