์ฐจํธ๋ณ๋ก ์ฌ์ฉํ ์ ์๋ API๋ ์ด ๊ฐ์ด๋์์ ๋ค๋ฃจ์ง ์๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ API๊ฐ ๊ถ๊ธํ๋ค๋ฉด API ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์.
RadialBar ์ฐจํธ์ ์์ฑ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ค. ์์ฑ์ ํจ์์ ์ ์ ํจ์๋ฅผ ํตํด ์์ฑํ ์ ์๋ค. ๊ฒฐ๊ณผ๋ ๋ชจ๋ ์ฐจํธ์ ์ธ์คํด์ค๊ฐ ๋ฐํ๋๋ค. ๋งค๊ฐ ๋ณ์๋ ์ฐจํธ๊ฐ ๊ทธ๋ ค์ง๋ ์์ญ์ธ HTML ์์ el
, ๋ฐ์ดํฐ๊ฐ์ธ data
, ์ต์
๊ฐ options
๊ฐ ๊ฐ์ฒด๋ก ๋ค์ด๊ฐ๋ค. el
๊ฐ์ ์ฐจํธ์ ์ปจํ
์ด๋ ์์ญ์ด๋ฏ๋ก ์ฐจํธ ์ธ์ ๋ค๋ฅธ ์์๋ค์ด ํฌํจ๋์ด ์์ผ๋ฉด ์ฐจํธ์ ์ํฅ์ ์ค ์ ์์์ผ๋ก ๋น์ด์๋ HTML ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
import { RadialBarChart } from '@toast-ui/chart';
const chart = new RadialBarChart({el, data, options});
// ํน์
import Chart from '@toast-ui/chart';
const chart = Chart.radialBarChart({el, data, options});
categories
๊ฐ์ Y์ถ์ ํฑ์ ๋ํ๋๋ฉฐ series
๊ฐ์ name
๊ณผ data
๊ฐ ๋ชจ๋ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํด์ผ ํ๋ค. name
์ ๊ฐ๊ฐ์ ์๋ฆฌ์ฆ๋ฅผ ๊ตฌ๋ถํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ ์ผํ id๋ก ์์ฑํ๋ค.
const data = {
categories: ['Korea', 'United States', 'Germany', 'Canada', 'Austria'],
series: [
{
name: 'Gold medals',
data: [132, 105, 92, 73, 64]
},
{
name: 'Silver medals',
data: [125, 110, 86, 64, 81]
},
{
name: 'Bronze medals',
data: [111, 90, 60, 62, 87]
}
]
};
options
๋ ๊ฐ์ฒด๋ก ์์ฑํ๋ค.
type options = {
chart?: {
//...
}
verticalAxis?: {
label?: {
interval?: number;
formatter?: (value: string, axisLabelInfo: { axisName: AxisType; labels: string[]; index: number }) => string;
margin?: number;
};
tick?: {
interval?: number;
};
}
circularAxis?: {
label?: {
interval?: number;
formatter?: (value: string, axisLabelInfo: { axisName: AxisType; labels: string[]; index: number }) => string;
margin?: number;
};
tick?: {
interval?: number;
};
scale: {
min?: number;
max?: number;
stepSize?: 'auto' | number;
};
}
legend?: {
//...
}
exportMenu?: {
//...
}
tooltip?: {
//...
}
responsive?: {
//...
}
theme?: {
// ์๋ ํ
๋ง ์ฑํฐ์์ ์ค๋ช
}
series?: {
selectable?: boolean;
eventDetectType?: 'point' | 'grouped';
clockwise?: boolean;
radiusRange?: {
inner?: number | string;
outer?: number | string;
};
angleRange?: {
start?: number;
end?: number;
};
dataLabels?: {
visible?: boolean;
anchor?: DataLabelAnchor;
formatter?: (value) => string;
};
}
}
์ด ์ฐจํธ์์ ์ฌ์ฉํ ์ ์๋ ๊ณตํต ์ต์ ์ ๋ํด์๋ ์ด ๊ฐ์ด๋์์ ๋ค๋ฃจ์ง ์๋๋ค. ํ์ํ๋ค๋ฉด ํด๋น ์ต์ ์ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์. (๋งํฌ:
chart
์ต์ , ๋ฒ๋ก, ๋ด๋ณด๋ด๊ธฐ, ํดํ,responsive
์ต์ )
ํด๋น ์๋ฆฌ์ฆ๋ฅผ ์ ํํ ์ ์๋ค.
- ๊ธฐ๋ณธ๊ฐ:
false
const options = {
series: {
selectable: true
}
};
selectable
์ต์
๊ณผ on
API์ selectSeries
, unselectSeries
๋ฅผ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ ํด๋น ์๋ฆฌ์ฆ์ ๋ํ ์ ์ด๋ฅผ ์ถ๊ฐ๋ก ํ ์ ์๋ค.
๋ง์ฐ์ค๋ฅผ ํตํด ์๋ฆฌ์ฆ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฑฐ๋ ํ์งํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
ํ์ | ์ค๋ช |
---|---|
point |
๊ฐ๋ณ ์๋ฆฌ์ฆ ์์ญ์ ๋ง์ฐ์ค๊ฐ ๋ค๊ฐ๊ฐ์ผ ํ์ง. ํ์ฌ ๋ง์ฐ์ค๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ํฌ์ธํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋จ ํ ๊ฐ๋ง ํ์ง๋จ |
grouped |
Y์ถ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ด ๊ฐ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ํ์ง๋จ |
- ๊ธฐ๋ณธ๊ฐ:
point
eventDetectType
์ 'grouped'
๋ก ์ค์ ํ ๊ฒฝ์ฐ Y์ถ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ด ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ํ์ง๋๋ค.
const options = {
series: {
eventDetectType: 'grouped'
}
};
์๋ฆฌ์ฆ๊ฐ ๊ทธ๋ ค์ง๋ ๋ฐฉํฅ์ ์ค์ ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ณ ๋ฐฉํฅ์ผ๋ก ๊ทธ๋ ค์ง๊ณ , false
๋ก ์ค์ ํ๋ฉด ์๊ณ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๊ทธ๋ ค์ง๋ค.
- ๊ธฐ๋ณธ๊ฐ:
true
const options = {
series: {
clockwise: false
}
};
radiusRange
๋ inner
์ outer
์ต์
์ ์ง์ ํ์ฌ ์์ชฝ ์์ ๋ฐ์ง๋ฆ๊ณผ ๋ฐ๊นฅ์ชฝ ์์ ๋ฐ์ง๋ฆ์ ์ค์ ํ๋ค. inner
์ ๊ธฐ๋ณธ๊ฐ์ 0
์ด๋ค. 0๋ณด๋ค ํฐ ๊ฐ์ ์
๋ ฅํ๋ฉด ๋๋ ๋ชจ์์ ์ฐจํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
์์ฑ | ์ค๋ช |
---|---|
radiusRange.inner |
์์ชฝ์ ๋ฐ์ง๋ฆ ์ค์ |
radiusRange.outer |
๋ฐ๊นฅ์ชฝ์ ๋ฐ์ง๋ฆ ์ค์ |
๊ฐ์ %
๋ฅผ ํฌํจํ ๋ฌธ์์ด ํ์
์ผ๋ก ์
๋ ฅํ๋ฉด ๋น์จ๋ก ๊ณ์ฐํ๋ค.
const options = {
series: {
radiusRange: {
inner: '20%',
outer: '80%',
}
}
};
๊ฐ์ ์ซ์ ํ์ ์ผ๋ก ์ ๋ ฅํ๋ฉด ๋ฐ์ง๋ฆ์ ์ ๋๊ฐ์ผ๋ก ๊ณ์ฐ๋๋ค.
const options = {
series: {
radiusRange: {
inner: 40,
outer: 200,
}
}
};
angleRange
๋ start
์ end
์ต์
์ ์ฌ์ฉํ์ฌ ํธ์ ๋ฒ์๋ฅผ ์ค์ ํ๋ค.
์์ฑ | ์ค๋ช |
---|---|
angleRange.start |
ํธ์ ์์ ๊ฐ๋ (๊ธฐ๋ณธ๊ฐ: 0 ) |
angleRange.end |
ํธ์ ๋ ๊ฐ๋ (๊ธฐ๋ณธ๊ฐ: 360 ) |
const options = {
series: {
angleRange: {
start: 45,
end: 315,
}
}
};
๋ฐ์ดํฐ ๋ผ๋ฒจ์ ์ฐจํธ์์ ์๋ฆฌ์ฆ์ ๋ํ ๊ฐ์ ํ์ํ๋ค.
dataLabels
์ต์
์ ๋ค์๊ณผ ๊ฐ๋ค.
type options = {
...
series: {
dataLabels: {
visible?: boolean;
anchor?: 'center' | 'outer';
formatter?: (value) => string;
};
};
};
์ด๋ฆ | ํ์ | ์ค๋ช |
---|---|---|
visible |
boolean | ๋ฐ์ดํฐ ๋ผ๋ฒจ ํ์ ์ฌ๋ถ |
formatter |
function | ๋ฐ์ดํฐ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ๋ฐ์ ์ถ๋ ฅ ํ์ ์ง์ |
anchor |
'start' | 'center' | 'end' | ๋ฐ์ดํฐ ๋ผ๋ฒจ ํ์ ์์น ์ค์ . (๊ธฐ๋ณธ๊ฐ: 'center' ) |
// ๊ธฐ๋ณธ
const options = {
series: {
dataLabels: { visible: true }
}
};
// start anchor ์ ์ฉ
const options = {
series: {
dataLabels: {
visible: true,
anchor: 'start'
}
}
};
center anchor ์ ์ฉ(๊ธฐ๋ณธ) | start anchor ์ ์ฉ | end anchor ์ ์ฉ |
---|---|---|
RadialBar ์ฐจํธ์์ ์์ ํ ์ ์๋ ์๋ฆฌ์ฆ ํ ๋ง์ด๋ค. ๋ฐ์ดํฐ ๋ผ๋ฒจ ์คํ์ผ์ ๊ฐ์ ๋ํ๋ด๋ ๊ธฐ๋ณธ ๋ผ๋ฒจ์ ํฌํจํ์ฌ, ํ์ดํ๊ฐ ์๋ ๋งํ์ ์คํ์ผ์ ์ฌ์ฉํ ์ ์๋ค.
interface RadialBarChartSeriesTheme {
colors?: string[];
barWidth?: number | string;
areaOpacity?: number;
lineWidth?: number;
strokeStyle?: string;
hover?: {
lineWidth?: number;
strokeStyle?: string;
shadowColor?: string;
shadowBlur?: number;
shadowOffsetX?: number;
shadowOffsetY?: number;
color?: string;
groupedSector?: {
color?: string;
opacity?: number;
};
};
select?: {
lineWidth?: number;
strokeStyle?: string;
shadowColor?: string;
shadowBlur?: number;
shadowOffsetX?: number;
shadowOffsetY?: number;
color?: string;
restSeries?: {
areaOpacity?: number;
};
areaOpacity?: number;
groupedSector?: {
color?: string;
opacity?: number;
};
};
dataLabels?: CommonDataLabelBoxTheme;
}
type CommonDataLabelBoxTheme = {
useSeriesColor?: boolean;
lineWidth?: number;
textStrokeColor?: string;
shadowColor?: string;
shadowBlur?: number;
fontSize?: number;
fontFamily?: string;
fontWeight?: string | number;
color?: string;
textBubble?: {
visible?: boolean;
paddingX?: number;
paddingY?: number;
backgroundColor?: string;
borderRadius?: number;
borderColor?: string;
borderWidth?: number;
shadowColor?: string;
shadowOffsetX?: number;
shadowOffsetY?: number;
shadowBlur?: number;
};
};
์ด๋ฆ | ํ์ | ์ค๋ช |
---|---|---|
colors |
string[] | ์๋ฆฌ์ฆ์ ์์ |
barWidth |
number | ์๋ฆฌ์ฆ ๋๋น |
areaOpacity |
number | ๋ชจ๋ ์๋ฆฌ์ฆ๊ฐ ํ์ฑ ๋์ด ์์ ๋์ ์ ์ฒด ์์ญ ํฌ๋ช ๋ |
lineWidth |
number | ์๋ฆฌ์ฆ์ ํ ๋๋ฆฌ ์ ๋๋น |
strokeStyle |
string | ์๋ฆฌ์ฆ์ ํ ๋๋ฆฌ ์ ์ |
hover |
object | ๋ฐ์ดํฐ์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ธ์ ๋ ์คํ์ผ |
hover.groupedSector |
object | ์ต์
series.eventDetectType: 'grouped' ๋ก ์ค์ ๋์ด ์์ ๋, Y์ถ ๊ธฐ์ค์ผ๋ก ๋ฎ์ด์ง๋ ๋ฐ์ค ์์ญ์ ์คํ์ผ |
select |
object | ์ต์
series.selectable: true ๋ก ์ค์ ๋์ด ์์ ๋ ์๋ฆฌ์ฆ๊ฐ ์ ํ ๋๋ฉด ์ ์ฉ๋๋ ์คํ์ผ |
select.groupedSector |
object | ์ต์
series.eventDetectType: 'grouped' ๋ก ์ค์ ๋์ด ์์ ๋, Y์ถ ๊ธฐ์ค์ผ๋ก ์ ํ๋๋ ๋ฐ์ค ์์ญ์ ์คํ์ผ |
dataLabels |
object | ๋ฐ์ดํฐ ๋ผ๋ฒจ ์คํ์ผ |
dataLabels.useSeriesColor |
boolean | ๊ธ์ ์์์ ์๋ฆฌ์ฆ ์์์ผ๋ก ์ฌ์ฉํ ์ง ์ฌ๋ถ |
dataLabels.lineWidth |
number | ํ ์คํธ ์ ๋๊ป |
dataLabels.textStrokeColor |
string | ํ ์คํธ ์ ์์ |
dataLabels.shadowColor |
string | ํ ์คํธ ๊ทธ๋ฆผ์ ์์ |
dataLabels.shadowBlur |
number | ํ ์คํธ ๊ทธ๋ฆผ์ Blur |
dataLabels.fontSize |
number | ๊ธ์ ํฌ๊ธฐ |
dataLabels.fontFamily |
string | ํฐํธ๋ช |
dataLabels.fontWeight |
string | ๊ธ์ ๊ตต๊ธฐ |
dataLabels.color |
string | ๊ธ์ ์์, useSeriesColor: true ๋ก ์ค์ ํ๊ฒฝ์ฐ ์ด ์ต์
์ ๋์๋์ง ์์ |
dataLabels.textBubble |
object | ๋งํ์ ๋์์ธ ์ค์ |
dataLabels.textBubble.visible |
boolean | ๋งํ์ ๋์์ธ ์ฌ์ฉ ์ฌ๋ถ |
dataLabels.textBubble.paddingX |
number | ์ํ ์ฌ๋ฐฑ |
dataLabels.textBubble.paddingY |
number | ์์ง ์ฌ๋ฐฑ |
dataLabels.textBubble.backgroundColor |
string | ๋งํ์ ๋ฐฐ๊ฒฝ์ |
dataLabels.textBubble.borderRadius |
number | ๋งํ์ ํ ๋๋ฆฌ์ ๋ฅ๊ทผ ๋ชจ์๋ฆฌ ๊ฐ |
dataLabels.textBubble.borderColor |
string | ๋งํ์ ํ ๋๋ฆฌ ์์ |
dataLabels.textBubble.borderWidth |
number | ๋งํ์ ํ ๋๋ฆฌ ๋๊ป |
dataLabels.textBubble.shadowColor |
string | ๋งํ์ ๊ทธ๋ฆผ์ ์์ |
dataLabels.textBubble.shadowOffsetX |
number | ๋งํ์ ๊ทธ๋ฆผ์ Offset X |
dataLabels.textBubble.shadowOffsetY |
number | ๋งํ์ ๊ทธ๋ฆผ์ Offset Y |
dataLabels.textBubble.shadowBlur |
number | ๋งํ์ ๊ทธ๋ฆผ์ Blur |
ํ
๋ง๋ ์ต์
์์ theme
์ต์
์ ์ง์ ํ๊ณ ์๋ฆฌ์ฆ ํ
๋ง๋ theme.series
๋ก ์ค์ ํ๋ค. ๊ฐ๋จํ ์์๋ก ์๋ฆฌ์ฆ์ ์์๊ณผ ํ
๋๋ฆฌ ์คํ์ผ์ ๋ณ๊ฒฝํ๊ณ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ธ์ ๋ ๊ทธ๋ฆผ์ ํจ๊ณผ๋ฅผ ์ ์ฉํด๋ณด์.
const options = {
theme: {
series: {
colors: ['#ef476f', '#ffd166', '#06d6a0', '#118ab2'],
lineWidth: 2,
strokeStyle: '#000000',
hover: {
strokeStyle: '#000000',
lineWidth: 2,
shadowColor: '#000000',
shadowBlur: 6
}
}
}
};
์ต์ ์ ๋ํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์๋ ์ฝ๋๋ ๋ฐ์ดํฐ ๋ผ๋ฒจ ํ ๋ง๋ฅผ ์ ์ฉํ์ฌ ๊ธ์ ์คํ์ผ์ ๋ณ๊ฒฝํ ์ต์ ์ด๋ค.
const options = {
series: {
dataLabels: { visible: true }
},
theme: {
series: {
dataLabels: {
fontFamily: 'monaco',
fontSize: 12,
fontWeight: 600,
useSeriesColor: true,
lineWidth: 2,
textStrokeColor: '#ffffff',
shadowColor: '#ffffff',
shadowBlur: 6
}
}
}
};