Skip to content

Range Bar и Range Area

Серии диапазонов: вместо yField — пара yLowField / yHighField.

Range Area

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

export function createOptions(): ChartOptions {
  return {
    data: getData(),
    title: { text: 'Temperature range' },
    series: [{ type: 'range-area', xField: 'month', yLowField: 'min', yHighField: 'max', name: 'Min–Max, °C' }],
    legend: { enabled: false },
  };
}
ts
export function getData() {
  return [
    { month: 'Jan', min: -12, max: -2 },
    { month: 'Feb', min: -10, max: 0 },
    { month: 'Mar', min: -4, max: 6 },
    { month: 'Apr', min: 2, max: 14 },
    { month: 'May', min: 8, max: 21 },
    { month: 'Jun', min: 13, max: 26 },
    { month: 'Jul', min: 15, max: 29 },
    { month: 'Aug', min: 13, max: 27 },
    { month: 'Sep', min: 8, max: 20 },
    { month: 'Oct', min: 2, max: 11 },
    { month: 'Nov', min: -4, max: 4 },
    { month: 'Dec', min: -9, max: -1 },
  ];
}

Range Bar

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

export function createOptions(): ChartOptions {
  return {
    data: getData(),
    title: { text: 'Salary ranges' },
    subtitle: { text: 'thousand ₽ per month' },
    series: [{ type: 'range-bar', xField: 'role', yLowField: 'from', yHighField: 'to', name: 'Range' }],
    legend: { enabled: false },
  };
}
ts
export function getData() {
  return [
    { role: 'Junior', from: 80, to: 150 },
    { role: 'Middle', from: 160, to: 260 },
    { role: 'Senior', from: 250, to: 400 },
    { role: 'Lead', from: 320, to: 480 },
  ];
}

Горизонтальные range-бары

direction: 'horizontal' разворачивает чарт: категории уходят на вертикальную ось.

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

export function createOptions(): ChartOptions {
  return {
    data: getData(),
    title: { text: 'Salary ranges' },
    subtitle: { text: 'thousand ₽ per month' },
    series: [
      {
        type: 'range-bar',
        xField: 'role',
        yLowField: 'from',
        yHighField: 'to',
        name: 'Range',
        direction: 'horizontal',
      },
    ],
    legend: { enabled: false },
  };
}
ts
export function getData() {
  return [
    { role: 'Junior', from: 80, to: 150 },
    { role: 'Middle', from: 160, to: 260 },
    { role: 'Senior', from: 250, to: 400 },
    { role: 'Lead', from: 320, to: 480 },
  ];
}

Цвет на каждый бар (Гант)

fill принимает колбэк ({ low, high, datum, index }) => цвет — красит каждый бар отдельно, например Гант-таймлайн по статусу задачи из одной серии:

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

// Colour each task bar by its status — a Gantt-style timeline from a single range-bar series.
const STATUS_COLORS: Record<string, string> = {
  done: '#22c55e',
  running: '#3b82f6',
  failed: '#ef4444',
  queued: '#94a3b8',
};

export function createOptions(): ChartOptions {
  return {
    data: getData(),
    title: { text: 'Pipeline run' },
    subtitle: { text: 'task timeline, hours' },
    series: [
      {
        type: 'range-bar',
        xField: 'task',
        yLowField: 'start',
        yHighField: 'end',
        direction: 'horizontal',
        cornerRadius: 3,
        fill: ({ datum }) => STATUS_COLORS[String(datum.status)] ?? '#94a3b8',
      },
    ],
    legend: { enabled: false },
  };
}
ts
export function getData() {
  return [
    { task: 'extract', start: 0, end: 3, status: 'done' },
    { task: 'validate', start: 3, end: 5, status: 'done' },
    { task: 'transform', start: 5, end: 11, status: 'running' },
    { task: 'notify', start: 8, end: 10, status: 'failed' },
    { task: 'load', start: 11, end: 14, status: 'queued' },
    { task: 'report', start: 14, end: 16, status: 'queued' },
  ];
}

Подписи диапазонов

label.formatter({ low, high, datum }); позиции как у bar — здесь center внутри бара с автоконтрастом:

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

export function createOptions(): ChartOptions {
  return {
    data: getData(),
    title: { text: 'Ranges with labels' },
    series: [
      {
        type: 'range-bar',
        xField: 'city',
        yLowField: 'min',
        yHighField: 'max',
        name: 'Temperature, °C',
        label: {
          enabled: true,
          placement: 'center',
          formatter: ({ low, high }) => `${low}…${high}`,
        },
      },
    ],
    legend: { enabled: false },
  };
}
ts
export function getData() {
  return [
    { city: 'Moscow', min: -8, max: 2 },
    { city: 'Sochi', min: 4, max: 12 },
    { city: 'Novosibirsk', min: -16, max: -6 },
    { city: 'Kazan', min: -10, max: 0 },
    { city: 'Vladivostok', min: -7, max: 1 },
  ];
}

Комбинация со средней линией

Range-area как фон + line поверх, общий тултип:

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

export function createOptions(): ChartOptions {
  return {
    data: getData(),
    title: { text: 'Range + average line' },
    series: [
      {
        type: 'range-area',
        xField: 'month',
        yLowField: 'min',
        yHighField: 'max',
        name: 'Range, °C',
        fillOpacity: 0.25,
      },
      { type: 'line', xField: 'month', yField: 'avg', name: 'Average', strokeWidth: 2.5 },
    ],
    tooltip: { mode: 'shared', range: 'nearest' },
  };
}
ts
export function getData() {
  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  return months.map((month, i) => {
    const mid = 8 + 14 * Math.sin(((i - 3) / 12) * Math.PI * 2);
    return {
      month,
      min: Math.round(mid - 5 - (i % 3)),
      max: Math.round(mid + 6 + ((i + 1) % 3)),
      avg: Math.round(mid),
    };
  });
}
ОпцияТипОписание
yLowFieldstringграницы диапазона
yHighFieldstringграницы диапазона
direction (bar)'vertical' | 'horizontal'направление баров (vertical)
fillColorValue | (params) => ColorValueзаливка; колбэк красит по datum
fillстилизаливка
fillOpacityстилизаливка
stroke (area)стиликонтурные линии
strokeWidth (area)стиликонтурные линии
cornerRadius (bar)Pixelsскругление

Полный список опций

ОпцияТипПо умолчаниюОписание
label.enabledbooleanfalseпоказать подписи значений
label.placementвнешние/center/inner-* (17 позиций)'top'позиция подписи
label.formatter({ low, high, datum }) => stringзначениесодержимое подписи
label.fontSizePixels11размер шрифта подписи
label.fontWeightstring | numbernormalнасыщенность
label.fontFamilystringшрифт темыгарнитура
label.colorColorValueforeground; внутри — автоконтрастцвет текста

Опции

Общие опции всех серий (name, showInLegend, tooltip.renderer, …) — в разделе Общие опции серий.