Skip to content

Тултип

Включён по умолчанию: при наведении показывается ближайший узел, сам узел подсвечивается, остальные серии приглушаются.

Модульная сборка

В сборке через grafit-charts/core тултип — отдельный модуль: register(tooltipModule).

По умолчанию тултип показывает значение xField заголовком и пару «имя серии: значение» с маркером серии. Исключение — точечные серии (scatter, bubble): у них обе оси — измерения, поэтому заголовок обозначает серию (маркер + name), а значения выводятся подписанными строками — xName: x, yName: y, у bubble ещё sizeName: size. Содержимое настраивается через tooltip.renderer на серии:

ts
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';

const rub = new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', maximumFractionDigits: 0 });

export function createOptions(): ChartOptions {
  return {
    data: getData(),
    title: { text: 'Orders this week' },
    series: [
      {
        type: 'bar',
        xField: 'day',
        yField: 'orders',
        name: 'Orders',
        tooltip: {
          // renderer returns the tooltip structure; datum gives access to the whole data row
          renderer: ({ datum, yValue, color }) => ({
            heading: `${datum.day} — ${yValue} orders`,
            rows: [{ label: 'Revenue', value: rub.format(datum.revenue as number), color }],
          }),
        },
      },
    ],
    legend: { enabled: false },
  };
}
ts
export function getData() {
  return [
    { day: 'Mon', orders: 142, revenue: 388000 },
    { day: 'Tue', orders: 158, revenue: 412000 },
    { day: 'Wed', orders: 149, revenue: 395500 },
    { day: 'Thu', orders: 173, revenue: 460200 },
    { day: 'Fri', orders: 196, revenue: 540800 },
    { day: 'Sat', orders: 224, revenue: 618400 },
    { day: 'Sun', orders: 201, revenue: 552300 },
  ];
}

Режимы

mode: 'single' (по умолчанию) показывает значение ближайшего узла; mode: 'shared' — значения всех видимых серий категории одним тултипом; подсвечиваются узлы всех серий, приглушение не применяется:

ts
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';

export function createOptions(): ChartOptions {
  return {
    data: getData(),
    title: { text: 'Shared tooltip' },
    subtitle: { text: "mode: 'shared' + range: 'nearest' — tooltip from anywhere" },
    series: [
      { type: 'line', xField: 'month', yField: 'plan', name: 'Plan' },
      { type: 'line', xField: 'month', yField: 'fact', name: 'Actual' },
      { type: 'line', xField: 'month', yField: 'forecast', name: 'Forecast', lineDash: [4, 3] },
    ],
    tooltip: { mode: 'shared', range: 'nearest' },
    crosshair: { enabled: true },
  };
}
ts
export function getData() {
  return [
    { month: 'Jan', plan: 120, fact: 134, forecast: 128 },
    { month: 'Feb', plan: 125, fact: 118, forecast: 124 },
    { month: 'Mar', plan: 130, fact: 142, forecast: 136 },
    { month: 'Apr', plan: 135, fact: 129, forecast: 133 },
    { month: 'May', plan: 140, fact: 151, forecast: 146 },
    { month: 'Jun', plan: 145, fact: 148, forecast: 150 },
  ];
}

Режим означает одно и то же везде, где серии делят категорию: радар несёт по мере на серию так же, как линейный график, поэтому спица под курсором отвечает сразу за все, — и так же ведут себя роза и радиальные столбцы, у которых общая угловая ось.

ts
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';

export function createOptions(): ChartOptions {
  return {
    data: getData(),
    title: { text: 'Shared tooltip on a radar' },
    subtitle: { text: "mode: 'shared' — every measure of the spoke under the cursor" },
    series: [
      { type: 'radar-line', angleField: 'metric', radiusField: 'alpha', name: 'Alpha' },
      { type: 'radar-line', angleField: 'metric', radiusField: 'beta', name: 'Beta' },
      { type: 'radar-line', angleField: 'metric', radiusField: 'gamma', name: 'Gamma' },
    ],
    tooltip: { mode: 'shared' },
  };
}
ts
export function getData() {
  return [
    { metric: 'Speed', alpha: 8.1, beta: 6.4, gamma: 4.9 },
    { metric: 'Quality', alpha: 7.4, beta: 8.6, gamma: 6.1 },
    { metric: 'Coverage', alpha: 5.2, beta: 7.1, gamma: 8.4 },
    { metric: 'Uptime', alpha: 9.0, beta: 8.2, gamma: 7.6 },
    { metric: 'Cost', alpha: 4.5, beta: 6.8, gamma: 8.9 },
    { metric: 'Support', alpha: 6.3, beta: 5.4, gamma: 7.2 },
  ];
}

Опции (chart-level)

ОпцияТипПо умолчаниюОписание
enabledbooleantrueпоказывать тултип
mode'single' | 'shared''single'один узел или вся категория
position.anchorTo'node' | 'center' | 'pointer''node'край узла, центр узла или курсор
position.xOffsetPixels0смещение тултипа
yOffsetPixels0смещение тултипа
rangePixels | 'exact' | 'nearest'30число — радиус в px; 'exact' — только попадание в узел; 'nearest' — ближайший узел из любого места области построения

Внешний вид

Контейнер тултипа настраивается там же, в tooltip:

ОпцияТипПо умолчаниюОписание
backgroundColorValueфон темыфон
borderColorColorValueприглушённый цвет темыцвет рамки
borderWidthPixels1толщина рамки; 0 убирает рамку
borderRadiusPixels6скругление углов
shadowstring | false0 2px 8px rgba(0,0,0,.25)CSS box-shadow; false — без тени
paddingPaddingValue | string7px 10pxвнутренние поля: 8, [8, 12], [8, 12, 4, 0], { top, right, bottom, left } или CSS-строка
fontSizePixels12размер шрифта
fontFamilystringsystem-ui, sans-serifгарнитура
colorColorValueforeground темыцвет текста
ts
tooltip: {
  background: '#141821',
  color: '#f0f0f0',
  borderColor: '#436ff4',
  borderRadius: 10,
  shadow: false,
},

Опции серии

series[].tooltip.renderer(params) возвращает строку (станет заголовком) или структуру:

ts
renderer: ({ datum, xValue, yValue, seriesName, color }) => ({
  heading: String(xValue),
  rows: [{ label: seriesName, value: String(yValue), color }],
});

params.datum — вся строка данных: в тултип можно выводить поля, не участвующие в серии.

heading — строка либо объект { text, color }; с color перед текстом заголовка рисуется такой же маркер, как у строк. Именно так scatter и bubble рисуют тултип по умолчанию — маркер обозначает серию, а не отдельную строку:

ts
renderer: ({ datum, xValue, yValue, seriesName, color }) => ({
  heading: { text: String(datum.category), color },
  rows: [
    { label: 'X', value: String(xValue) },
    { label: 'Y', value: String(yValue) },
  ],
});

Подсветка управляется блоком highlight:

ОпцияТипПо умолчаниюОписание
enabledbooleantrueподсветка узла и приглушение остальных серий
dimOpacityFraction0.8прозрачность неподсвеченных серий (1 — не приглушать)
highlight.enabledbooleantrueподсветка узла и приглушение
highlight.dimOpacityFraction0.8прозрачность неподсвеченных серий