В визуализациях типа choropleth библиотека Nivo использует цвет как основной носитель информации о числовых значениях, привязанных к географическим регионам. Каждый регион получает значение (например, численность населения, уровень дохода, плотность событий), которое затем преобразуется в цвет через заданную шкалу.
Ключевой механизм заключается в отображении диапазона значений → диапазон цветов, где:
В Nivo это реализуется через комбинацию:
colorScaledomaincolorsunknownColorvalueFormatКомпонент строится вокруг геоданных (TopoJSON или GeoJSON) и набора данных:
import { ResponsiveChoropleth } from '@nivo/geo'
import worldCountries from './world_countries.json'
const data = [
{ id: 'FRA', value: 123 },
{ id: 'USA', value: 456 },
{ id: 'RUS', value: 78 }
]
Ключевой момент: поле id должно совпадать с
идентификатором в геоданных (feature.id или заданное поле
через match).
Основная конфигурация задаётся через colors и
colorScale.
<ResponsiveChoropleth
data={data}
features={worldCountries.features}
match={d => d.id}
colors="YlOrRd"
/>
Здесь используется готовая палитра ColorBrewer. Nivo поддерживает множество схем:
Используется для монотонно возрастающих данных.
colors={{
scheme: 'blues'
}}
Поведение:
Такая шкала применяется для:
Используется, когда важно выделить центр (нулевое или среднее значение).
colors={{
scheme: 'spectral'
}}
Особенность:
Применяется для:
Можно задать собственные цвета:
colors={[
'#f7fbff',
'#c6dbef',
'#6baed6',
'#2171b5',
'#08306b'
]}
В этом случае Nivo автоматически интерполирует значения между цветами.
Один из наиболее точных способов управления визуализацией.
<ResponsiveChoropleth
data={data}
features={worldCountries.features}
domain={[0, 100, 200, 500, 1000]}
colors={['#edf8fb', '#b3cde3', '#8c96c6', '#8856a7', '#810f7c']}
unknownColor="#666666"
/>
При непрерывной шкале цвет вычисляется через интерполяцию.
colors={{
type: 'sequential',
scheme: 'greens'
}}
Или через кастом:
colors={{
type: 'sequential',
colors: ['#e5f5e0', '#31a354']
}}
Каждое значение преобразуется в число от 0 до 1, затем интерполируется цвет.
Используется для данных с сильной асимметрией.
colors={{
type: 'sequential',
scale: 'log',
scheme: 'oranges'
}}
Подходит для:
Если данные не содержат значения для региона, используется
unknownColor.
unknownColor="#d3d3d3"
Типичные стратегии:
Ключевая часть choropleth — сопоставление данных и географии.
match={(feature) => feature.id}
Варианты:
feature.idfeature.properties.codeПри несовпадении данных регион будет окрашен в
unknownColor.
Nivo позволяет явно задать домен:
domain={[0, 1000]}
Если домен не задан:
Для отображения значений в tooltip используется
valueFormat:
valueFormat=" >-.2f"
Примеры:
>-.0f — целые числа.2f — два знака после запятой+,.0f — с плюсом и разделителямиЛегенда критична для интерпретации choropleth.
legends={[
{
anchor: 'bottom-left',
direction: 'column',
translateX: 20,
itemWidth: 80,
itemHeight: 18,
symbolSize: 12
}
]}
Типы легенд:
Цветовая шкала усиливается визуально через контуры:
borderWidth={0.5}
borderColor="#152538"
Контраст между заливкой и границей улучшает читаемость при близких оттенках.
Nivo поддерживает плавную интерполяцию:
motionConfig="gentle"
Эффекты:
Помимо цветовой шкалы можно использовать defs:
defs={[
{
id: 'dots',
type: 'patternDots',
background: 'inherit',
color: '#ffffff',
size: 4,
padding: 1,
stagger: true
}
]}
И применение:
fill={[
{
match: { id: 'USA' },
id: 'dots'
}
]}
Это позволяет:
Выбор шкалы зависит от характера данных:
Монотонные данные
Сравнение отклонений
Категоризация по порогам
Сильно перекошенные данные
id между данными и географиейundefined значенийПри изменении data Nivo:
При этом фиксированный domain стабилизирует визуализацию
и предотвращает «скачки» цветов между обновлениями.