Заголовок и подзаголовок
title и subtitle рисуются вокруг области построения. У обоих одинаковые опции: текст, шрифт, цвет, выравнивание, вертикальное размещение и отступы вокруг текста.
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';
// Custom caption fonts, colors and padding.
export function createOptions(): ChartOptions {
return {
data: getData(),
title: { text: 'Annual revenue', fontSize: 22, fontWeight: 800, color: '#0f766e', padding: { bottom: 4 } },
subtitle: { text: 'by quarter, $K', fontSize: 14, color: '#94a3b8', padding: { bottom: 16 } },
series: [{ type: 'bar', xField: 'quarter', yField: 'revenue', name: 'Revenue' }],
legend: { enabled: false },
};
}export function getData() {
return [
{ quarter: 'Q1', revenue: 210 },
{ quarter: 'Q2', revenue: 265 },
{ quarter: 'Q3', revenue: 248 },
{ quarter: 'Q4', revenue: 312 },
];
}Опции
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
text | string | — | текст заголовка |
enabled | boolean | true | показать заголовок |
textAlign | 'left' | 'center' | 'right' | 'center' | выравнивание по ширине чарта (с учётом padding) |
position | 'top' | 'bottom' | 'top' | над или под областью построения |
fontSize | Pixels | 17 / 13 | размер шрифта title / subtitle |
fontWeight | FontWeight | 'bold' / 'normal' | насыщенность |
fontFamily | string | шрифт темы | гарнитура |
color | ColorValue | foreground / muted | цвет текста |
padding | PaddingValue | 8 со стороны области построения | отступы вокруг текста: 8, [8, 12], [8, 12, 4, 0] или { top, right, bottom, left } |
spacing | Pixels | 8 | устарело — отступ со стороны области построения, то же, что эта сторона padding |
wrap | boolean | true | переносить длинный текст на несколько строк |
Выравнивание и размещение
textAlign позиционирует заголовок по ширине чарта с привязкой к padding; position переносит его под область построения. Title и subtitle настраиваются независимо — их можно свободно сочетать, например заголовок слева сверху и подпись-сноска справа снизу:
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';
// Left-aligned title on top, a footnote-style subtitle at the bottom right.
export function createOptions(): ChartOptions {
return {
data: getData(),
title: { text: 'Weekly sessions', textAlign: 'left', padding: { bottom: 12 } },
subtitle: { text: 'updated hourly', textAlign: 'right', position: 'bottom' },
series: [{ type: 'area', xField: 'day', yField: 'sessions', name: 'Sessions' }],
legend: { enabled: false },
};
}export function getData() {
return [
{ day: 'Mon', sessions: 320 },
{ day: 'Tue', sessions: 356 },
{ day: 'Wed', sessions: 402 },
{ day: 'Thu', sessions: 384 },
{ day: 'Fri', sessions: 441 },
{ day: 'Sat', sessions: 268 },
{ day: 'Sun', sessions: 214 },
];
}Когда оба заголовка в одной зоне, title всегда выше subtitle; к области построения обращён отступ последнего из них.
Отступы
padding принимает тот же CSS-подобный формат, что и остальные отступы в опциях: одно число, [вертикаль, горизонталь], [top, right, bottom, left] или объект со сторонами:
title: { text: 'Трафик сайта', padding: 12 }, // все четыре стороны
title: { text: 'Трафик сайта', padding: [4, 24] }, // вертикаль, горизонталь
title: { text: 'Трафик сайта', padding: [4, 24, 12, 24] }, // top, right, bottom, left
title: { text: 'Трафик сайта', padding: { bottom: 12 } }, // одна сторона, остальные по умолчаниюПо умолчанию отступ 8px есть только со стороны, обращённой к области построения: снизу от заголовка в зоне 'top' и сверху — в зоне 'bottom'. Стороны, не указанные в объектной форме, сохраняют это значение, так что { bottom: 12 } у верхнего заголовка — просто более широкий зазор до графика.
Вертикальные отступы увеличивают блок заголовка и на столько же уменьшают область построения. Горизонтальные сужают ширину, по которой измеряется текст: заголовок с выравниванием влево начинается на padding.left правее отступа чарта, а длинный текст переносится раньше:
grafit.create({
container: '#chart',
title: { text: 'Site traffic', padding: { bottom: 4 } },
subtitle: { text: 'visits per month, thousands', padding: { bottom: 28 } },
// ...
});Если сверху стоят оба заголовка, title.padding.bottom разделяет title и subtitle, а subtitle.padding.bottom — subtitle и график. То есть увеличивать нужно отступ у того заголовка, который идёт последним. Без subtitle к области построения обращён title. Чтобы отодвинуть от края чарта сами заголовки, используйте padding.top (или padding.bottom) на уровне чарта.
Старая опция spacing продолжает работать и задаёт тот же зазор со стороны графика, но при указании обеих выигрывает padding.
Длинный текст
Заголовок, который не помещается в доступную ширину, переносится по словам на несколько строк с шагом fontSize × 1.25: он растёт вниз (в зоне 'bottom' — вверх), а область построения уменьшается на ту же величину. Символ '\n' в тексте всегда начинает новую строку — если нужно ровно две строки, измерять ничего не придётся:
title: { text: 'Трафик сайта по каналам привлечения\nдвенадцать месяцев по август' },wrap: false оставляет текст в одну строку, даже если он выходит за края чарта; явные переносы '\n' при этом сохраняются.
Обтекание плавающей легенды
Плавающая легенда рисуется поверх всей области чарта, включая заголовки. По умолчанию заголовки её обтекают: каждая строка, попадающая на уровень бокса легенды, размещается в более широком промежутке рядом с ним, а строки ниже снова занимают полную ширину. Так длинный заголовок слева и легенда top-right делят верхнюю зону без наложения:
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';
// Long captions wrap onto several lines and flow around the floating legend
// instead of running underneath it.
export function createOptions(): ChartOptions {
return {
data: getData(),
title: { text: 'Site traffic by acquisition channel, twelve months to August', textAlign: 'left', padding: { bottom: 4 } },
subtitle: { text: 'visits per month, thousands; organic includes search and referrals', textAlign: 'left', padding: { bottom: 12 } },
series: [
{ type: 'line', xField: 'month', yField: 'organic', name: 'Organic' },
{ type: 'line', xField: 'month', yField: 'ads', name: 'Ads' },
],
legend: {
position: 'top-right',
floating: true,
background: { fill: 'rgba(255, 255, 255, 0.85)', stroke: '#cbd5e1', cornerRadius: 6, padding: 10 },
},
};
}export function getData() {
return [
{ month: 'Jan', organic: 42, ads: 18 },
{ month: 'Feb', organic: 48, ads: 22 },
{ month: 'Mar', organic: 55, ads: 21 },
{ month: 'Apr', organic: 61, ads: 27 },
{ month: 'May', organic: 58, ads: 33 },
{ month: 'Jun', organic: 67, ads: 30 },
{ month: 'Jul', organic: 74, ads: 36 },
{ month: 'Aug', organic: 71, ads: 41 },
];
}Отключается через legend.avoidCaptions: false — тогда заголовки занимают всю ширину чарта, а легенда рисуется поверх них. Если легенда не оставляет пригодного промежутка ни слева, ни справа (широкая легенда по центру), строка тоже возвращается к полной ширине.
Короткий заголовок с выравниванием влево хорошо сочетается с плавающей легендой в противоположном углу на том же уровне:
import { getData } from './data';
import type { ChartOptions } from 'grafit-charts';
// A floating legend anchored to the top-right corner of the whole chart —
// on the same level as the left-aligned title.
export function createOptions(): ChartOptions {
return {
data: getData(),
title: { text: 'Site traffic', textAlign: 'left', padding: { bottom: 4 } },
subtitle: { text: 'visits per month, thousands', textAlign: 'left', padding: { bottom: 12 } },
series: [
{ type: 'line', xField: 'month', yField: 'organic', name: 'Organic' },
{ type: 'line', xField: 'month', yField: 'ads', name: 'Ads' },
],
legend: {
position: 'top-right',
floating: true,
background: {
fill: 'rgba(255, 255, 255, 0.9)',
stroke: '#cbd5e1',
cornerRadius: 6,
// CSS-like shorthand: [vertical, horizontal]
padding: [8, 12],
// lifts the panel off the plot it overlays
shadow: { color: 'rgba(15, 23, 42, 0.18)', blur: 10, offsetY: 3 },
},
},
};
}export function getData() {
return [
{ month: 'Jan', organic: 42, ads: 18 },
{ month: 'Feb', organic: 48, ads: 22 },
{ month: 'Mar', organic: 55, ads: 21 },
{ month: 'Apr', organic: 61, ads: 27 },
{ month: 'May', organic: 58, ads: 33 },
{ month: 'Jun', organic: 67, ads: 30 },
{ month: 'Jul', organic: 74, ads: 36 },
{ month: 'Aug', organic: 71, ads: 41 },
];
}