Линейные графики в Nivo (@nivo/line) используют точки
(points) как визуальные маркеры значений временных или категориальных
рядов. Эти элементы являются не просто декоративными объектами, а
ключевым механизмом интерпретации данных: они фиксируют дискретные
измерения на непрерывной линии и позволяют точно считывать значения.
Размер точек в линейном графике определяется через параметр
pointSize. Он задаёт радиус окружности (или базовый размер
фигуры, если используется кастомная форма).
<ResponsiveLine
data={data}
margin={{ top: 50, right: 110, bottom: 50, left: 60 }}
pointSize={10}
/>
Изменение размера влияет не только на визуальную плотность графика,
но и на его читаемость. При работе с большим количеством серий
увеличение pointSize приводит к визуальному шуму, тогда как
уменьшение делает график более «гладким», но снижает точность восприятия
отдельных значений.
На практике используются несколько режимов:
4–6) — для плотных временных рядов7–10) — универсальный вариант11–16) — для акцентирования редких точекДополнительно можно управлять толщиной обводки:
pointBorderWidth={2}
Это позволяет отделять точки от фона и линии даже при совпадении цветов.
Цветовая настройка точек в Nivo может задаваться несколькими способами: через фиксированное значение, функцию или привязку к серии данных.
pointColor="#ff6600"
Все точки получают единый цвет, что уместно в односерийных графиках или в случаях, когда линии уже несут смысловую дифференциацию.
pointColor={{ from: 'serieColor' }}
Такой подход синхронизирует цвет точки с цветом линии, что создаёт визуальную целостность графика.
pointColor={(point) => point.serieColor}
Функция позволяет вводить условную логику: изменение цвета в зависимости от значения, индекса или внешних условий.
Примеры использования:
Для повышения читаемости используется комбинация
pointBorderWidth и pointBorderColor.
pointBorderWidth={2}
pointBorderColor="#ffffff"
Белая обводка часто применяется на тёмных или насыщенных графиках, где точки иначе теряются на фоне линий.
Контрастная обводка выполняет две функции:
Базовая форма точек в Nivo — окружность, но библиотека позволяет
заменять её через pointSymbol.
pointSymbol={(props) => (
<rect
x={-6}
y={-6}
width={12}
height={12}
fill={props.color}
/>
)}
Возможные формы:
Кастомизация формы используется для:
При использовании SVG-фигур важно учитывать систему координат Nivo: центр точки находится в (0,0), поэтому геометрия строится относительно центра.
Пример ромба:
pointSymbol={(props) => (
<g>
<path
d="M0,-6 L6,0 L0,6 L-6,0 Z"
fill={props.color}
/>
</g>
)}
Такой подход позволяет точно контролировать визуальную форму без зависимости от стандартных примитивов.
Nivo допускает динамическое изменение параметров точек на основе данных.
pointSize={(point) => Math.sqrt(point.data.y)}
Такой приём создаёт эффект «веса» значений: чем выше показатель, тем крупнее точка.
pointColor={(point) =>
point.data.y > 100 ? '#e74c3c' : '#2ecc71'
}
Это позволяет мгновенно выделять критические зоны данных.
Точки в Nivo поддерживают интерактивность: при наведении изменяются масштаб, цвет и прозрачность.
Основные параметры:
activeSize={14}
inactiveOpacity={0.3}
activeSize увеличивает точку при наведенииinactiveOpacity затемняет остальные элементыТакой механизм используется для фокусировки внимания на одной серии или одном значении.
Nivo строит графики через систему слоёв (layers). Точки
являются частью слоя points, который можно
переопределить.
layers={[
'grid',
'markers',
'areas',
'lines',
'points',
CustomPointsLayer,
'legends'
]}
Кастомный слой точек позволяет полностью заменить стандартную отрисовку:
const CustomPointsLayer = ({ points }) => (
<g>
{points.map(point => (
<circle
key={point.id}
cx={point.x}
cy={point.y}
r={8}
fill={point.color}
stroke="#000"
/>
))}
</g>
)
Такой подход используется при необходимости:
pointSize={4}pointBorderWidth={1}inactiveOpacity={0.2}Характеристика: минимальная визуальная нагрузка, акцент на линиях.
pointSize={10}pointColoractiveSize={14}Характеристика: выделение ключевых точек, удобство анализа пиков.
pointSymbolХарактеристика: различение групп данных без перегрузки цветом линий.
Временные ряды в Nivo становятся интерпретируемыми именно благодаря точкам. Линия интерполирует значения, но не фиксирует дискретность. Точки выполняют роль «якорей данных», обеспечивая:
При отключении точек (enablePoints={false}) график
становится более гладким, но теряет точность восприятия отдельных
измерений, особенно при редких или нерегулярных данных.
При большом количестве точек критично учитывать нагрузку на DOM и SVG-рендеринг.
Подходы:
pointSizeenablePoints={false} для больших наборов
данныхpointSymbol до базовых формОсобенно важным становится отказ от сложных SVG-компонентов в кастомных точках, так как они масштабируются на каждый элемент серии.
В Nivo темы (theme) позволяют централизованно управлять
стилями:
theme={{
axis: {
ticks: {
text: {
fill: '#666'
}
}
},
crosshair: {
line: {
stroke: '#999'
}
}
}}
Хотя точки задаются отдельно, их визуальная согласованность с темой достигается через:
Каждая точка в Nivo несёт в себе набор состояний:
Эти состояния позволяют строить семантические графики, где точка становится носителем дополнительного смысла, а не только координаты.
Комбинация стандартных и кастомных точек используется для построения многослойных визуализаций:
pointSize={(point) =>
point.index === point.data.length - 1 ? 12 : 6
}
Такой подход создаёт естественную иерархию данных внутри одного графика.