Skip to content

Latest commit

ย 

History

History
675 lines (585 loc) ยท 19 KB

chart-column.md

File metadata and controls

675 lines (585 loc) ยท 19 KB

Column ์ฐจํŠธ

์ฐจํŠธ๋ณ„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๋Š” ์ด ๊ฐ€์ด๋“œ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ API๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด API ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

์ฐจํŠธ ์ƒ์„ฑํ•˜๊ธฐ

Column ์ฐจํŠธ์˜ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ์ •์  ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋ชจ๋‘ ์ฐจํŠธ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์ฐจํŠธ๊ฐ€ ๊ทธ๋ ค์ง€๋Š” ์˜์—ญ์ธ HTML ์š”์†Œ el, ๋ฐ์ดํ„ฐ๊ฐ’์ธ data, ์˜ต์…˜๊ฐ’ options๊ฐ€ ๊ฐ์ฒด๋กœ ๋“ค์–ด๊ฐ„๋‹ค. el ๊ฐ’์€ ์ฐจํŠธ์˜ ์ปจํ…Œ์ด๋„ˆ ์˜์—ญ์ด๋ฏ€๋กœ ์ฐจํŠธ ์™ธ์— ๋‹ค๋ฅธ ์š”์†Œ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์ฐจํŠธ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ์œผ๋กœ ๋น„์–ด์žˆ๋Š” HTML ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

import { ColumnChart } from '@toast-ui/chart';

const chart = new ColumnChart({el, data, options});

// ํ˜น์€

import Chart from '@toast-ui/chart';

const chart = Chart.columnChart({el, data, options});

๊ธฐ๋ณธ ์ฐจํŠธ

๋ฐ์ดํ„ฐ ํƒ€์ž…

categories ๊ฐ’์€ X์ถ•์˜ ํ‹ฑ์— ๋‚˜ํƒ€๋‚˜๋ฉฐ series ๊ฐ’์€ name๊ณผ data๊ฐ€ ๋ชจ๋‘ ์ž‘์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค. name์€ ๊ฐ๊ฐ์˜ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๊ตฌ๋ถ„ํ•  ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ id๋กœ ์ž‘์„ฑํ•œ๋‹ค.

const data = {
  categories: ['Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
  series: [
    {
      name: 'Budget',
      data: [5000, 3000, 5000, 7000, 6000, 4000, 1000]
    },
    {
      name: 'Income',
      data: [8000, 4000, 7000, 2000, 6000, 3000, 5000]
    },
    {
      name: 'Expenses',
      data: [4000, 4000, 6000, 3000, 4000, 5000, 7000]
    },
    {
      name: 'Debt',
      data: [3000, 4000, 3000, 1000, 2000, 4000, 3000]
    }
  ]
}

image

range ์ฐจํŠธ

๋ฐ์ดํ„ฐ ํƒ€์ž…

๊ธฐ๋ณธ ์ฐจํŠธ์™€ ๋‹ค๋ฅธ ์ ์€ series data์˜ ํƒ€์ž…์ด๋‹ค. data๋Š” ๋ฐฐ์—ด๋กœ ์ž…๋ ฅ๋˜๋ฉฐ ๋ฒ”์œ„์˜ ์‹œ์ž‘๊ณผ ๋์„ ์ˆซ์ž๊ฐ’์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅํ•œ๋‹ค.

const data = {
  categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
  series: [
    {
      name: 'Seoul',
      data: [
        [-8.3, 0.3],
        [-5.8, 3.1],
        [-0.6, 9.1],
        [5.8, 16.9],
        [11.5, 22.6],
        [16.6, 26.6],
        [21.2, 28.8],
        [21.8, 30.0],
        [15.8, 25.6],
        [8.3, 19.6],
        [1.4, 11.1],
        [-5.2, 3.2],
      ],
    },
    {
      name: 'Busan',
      data: [
        [0, 10],
        [3.5, 13.1],
        [5.6, 13.1],
        [10.8, 16.9],
        [11.5, 18.6],
        [13.6, 20.6],
        [15.2, 20.8],
        [21.8, 26.0],
        [17.8, 23.6],
        [11.3, 16.6],
        [4.4, 11.1],
        [3.2, 11.2],
      ],
    },
  ],
}

image

๊ทธ๋ฃนํ˜• ์Šคํƒ ์ฐจํŠธ

stack ์˜ต์…˜์„ ํ†ตํ•ด ์‹œ๋ฆฌ์ฆˆ๋“ค์ด ์Œ“์ธ ํ˜•ํƒœ์ธ ์Šคํƒ ์ฐจํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์‹œ๋ฆฌ์ฆˆ ๋ฐ์ดํ„ฐ์— stackGroup ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ๊ฐ™์€ stackGroup๋ผ๋ฆฌ ์Œ“์ธ๋‹ค.

const data = {
  categories: [
    '0 ~ 9',
    '10 ~ 19',
    '20 ~ 29',
    '30 ~ 39',
    '40 ~ 49',
    '50 ~ 59',
    '60 ~ 69',
    '70 ~ 79',
    '80 ~ 89',
    '90 ~ 99',
    '100 ~',
  ],
  series: [
    {
      name: 'Male - Seoul',
      data: [4007, 5067, 7221, 8358, 8500, 7730, 4962, 2670, 6700, 776, 131],
      stackGroup: 'Male',
    },
    {
      name: 'Female - Seoul',
      data: [3805, 4728, 7244, 8291, 8530, 8126, 5483, 3161, 1274, 2217, 377],
      stackGroup: 'Female',
    },
    {
      name: 'Male - Incheon',
      data: [1392, 1671, 2092, 2339, 2611, 2511, 1277, 6145, 1713, 1974, 194],
      stackGroup: 'Male',
    },
    {
      name: 'Female - Incheon',
      data: [1320, 1558, 1927, 2212, 2556, 2433, 1304, 8076, 3800, 6057, 523],
      stackGroup: 'Female',
    },
  ],
};

const options = {
  series: {
    stack: true
  }
};

group-stack

visible ์˜ต์…˜

๊ฐ๊ฐ์˜ series๋Š” visible ์˜ต์…˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. visible ์˜ต์…˜์€ ์ฒ˜์Œ ์ฐจํŠธ๊ฐ€ ๊ทธ๋ ค์กŒ์„ ๋•Œ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๋‚˜ํƒ€๋‚ผ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ด๋‹ค. ๊ธฐ๋ณธ ์ฐจํŠธ์™€ range, ๊ทธ๋ฃนํ˜• ์Šคํƒ ์ฐจํŠธ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋™์ผํ•˜๋‹ค.

const data = {
  categories: ['Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
  series: [
    {
      name: 'Budget',
      data: [5000, 3000, 5000, 7000, 6000, 4000, 1000],
      visible: false
    },
    {
      name: 'Income',
      data: [8000, 4000, 7000, 2000, 6000, 3000, 5000]
    },
    {
      name: 'Expenses',
      data: [4000, 4000, 6000, 3000, 4000, 5000, 7000]
    },
    {
      name: 'Debt',
      data: [3000, 4000, 3000, 1000, 2000, 4000, 3000]
    }
  ]
}

์œ„ ์˜ต์…˜์„ ์ ์šฉํ•ด ์ฐจํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋ณด๋ฉด ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ํ•ด์ œ๋˜์–ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

colorByCategories ์˜ต์…˜

๊ฐ๊ฐ์˜ series๋Š” colorByCategories ์˜ต์…˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. colorByCategories ์˜ต์…˜์€ ์ฐจํŠธ์˜ ๋ง‰๋Œ€ ์ƒ‰์„ ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์น ํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ด๋‹ค.

const data = {
  categories: ['Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
  series: [
    {
      name: 'Budget',
      data: [5000, 3000, 5000, 7000, 6000, 4000, 1000],
      colorByCategories: true
    }
  ]
}

image

์˜ต์…˜

options๋Š” ๊ฐ์ฒด๋กœ ์ž‘์„ฑํ•œ๋‹ค.

type options = {
  chart?: {
    // ...
  },
  xAxis?: {
    // ...
  },
  yAxis?: {
    // ...
  },
  legend?: {
    // ...
  },
  exportMenu?: {
    // ...
  },
  tooltip?: {
    // ...
  },
  plot?: {
    // ...
  },
  responsive?: {
    // ...
  },
  theme?: {
    // ์•„๋ž˜ ํ…Œ๋งˆ ์ฑ•ํ„ฐ์—์„œ ์„ค๋ช…
  },
  series?: {
    stack?: boolean | {
      type: 'normal' | 'percent';
      connector?: boolean;
    };
    selectable?: boolean;
    eventDetectType?: 'point' | 'grouped';
    diverging?: boolean;
    dataLabels?: {
      visible?: boolean;
      anchor?: 'center' | 'start' | 'end' | 'auto';
      offsetX?: number;
      offsetY?: number;
      formatter?: (value) => string;
      stackTotal?: {
        visible?: boolean;
        formatter?: (value) => string;
      };
    };
  }
};

์ด ์ฐจํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต ์˜ต์…˜์— ๋Œ€ํ•ด์„œ๋Š” ์ด ๊ฐ€์ด๋“œ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•ด๋‹น ์˜ต์…˜์˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž. (๋งํฌ: chart ์˜ต์…˜, ์ถ•, ๋ฒ”๋ก€, ๋‚ด๋ณด๋‚ด๊ธฐ, ํˆดํŒ, ํ”Œ๋กฏ, responsive ์˜ต์…˜ )

stack

stack ์˜ต์…˜์„ ํ†ตํ•ด ์‹œ๋ฆฌ์ฆˆ๋“ค์ด ์Œ“์ธ ํ˜•ํƒœ์ธ ์Šคํƒ ์ฐจํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์Šคํƒ ์ฐจํŠธ๋Š” 'normal' ํƒ€์ž…๊ณผ 'percent' ํƒ€์ž…์ด ์กด์žฌํ•œ๋‹ค. stack.connector ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ๊ฐ™์€ ์‹œ๋ฆฌ์ฆˆ์— ๋Œ€ํ•ด ์„ ์„ ์ด์–ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

normal ํƒ€์ž…

series.stack์„ true๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ stack.type์„ 'normal' ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

const options = {
  series: {
    stack: true
  }
}

// ํ˜น์€

const options = {
  series: {
    stack: {
      type: 'normal'
    }
  }
}

image

series.stack.connector์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ์„ ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

const options = {
  series: {
    stack: {
      type: 'normal',
      connector: true
    }
  }
}

image

percent ํƒ€์ž…

stack.type์„ 'percent'๋กœ ์„ค์ •ํ•˜๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ์„ ๋ฐฑ๋ถ„์œจ๋กœ ํ‘œ์‹œํ•œ๋‹ค.

const options = {
  series: {
    stack: {
      type: 'percent'
    }
  }
}

image

connector ์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ์„ ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

const options = {
  series: {
    stack: {
      type: 'percent',
      connector: true
    }
  }
}

image

selectable

ํ•ด๋‹น ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’: false
const options = {
  series: {
    selectable: true
  }
};

image

selectable ์˜ต์…˜๊ณผ on API์˜ selectSeries, unselectSeries๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์‹œ๋ฆฌ์ฆˆ์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ์ถ”๊ฐ€๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

eventDetectType

๋งˆ์šฐ์Šค๋ฅผ ํ†ตํ•ด ์‹œ๋ฆฌ์ฆˆ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค.

ํƒ€์ž… ์„ค๋ช…
point ๊ฐœ๋ณ„ ์‹œ๋ฆฌ์ฆˆ ์˜์—ญ์— ๋งˆ์šฐ์Šค๊ฐ€ ๋‹ค๊ฐ€๊ฐ€์•ผ ํƒ์ง€. ํ˜„์žฌ ๋งˆ์šฐ์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ํฌ์ธํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹จ ํ•œ ๊ฐœ๋งŒ ํƒ์ง€๋จ
grouped X์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์ด ๊ฐ™์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ํƒ์ง€๋จ
  • ๊ธฐ๋ณธ๊ฐ’: point

eventDetectType.point

eventDetectType์„ 'grouped'๋กœ ์„ค์ •ํ•  ๊ฒฝ์šฐ X์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ํƒ์ง€๋œ๋‹ค.

const options = {
  series: {
    eventDetectType: 'grouped'
  }
};

eventDetectType.grouped

diverging

diverging ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ธ๊ตฌ ๋ถ„ํฌ ์ฐจํŠธ์™€ ๊ฐ™์ด ์–‘์ชฝ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„ ๋ถ„๊ธฐ ์ฐจํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ถ„๊ธฐ ์ฐจํŠธ๋Š” data.series์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’: false
const data = {
    categories: [
    '100 ~',
    '90 ~ 99',
    '80 ~ 89',
    '70 ~ 79',
    '60 ~ 69',
    '50 ~ 59',
    '40 ~ 49',
    '30 ~ 39',
    '20 ~ 29',
    '10 ~ 19',
    '0 ~ 9',
  ],
  series: [
    {
      name: 'Male',
      data: [383, 3869, 39590, 136673, 248265, 419886, 451052, 391113, 352632, 296612, 236243],
    },
    {
      name: 'Female',
      data: [1255, 12846, 83976, 180790, 263033, 412847, 435981, 374321, 317092, 272438, 223251],
    },
  ],
};

const options = {
  series: {
    diverging: true
  }
};

diverging

dataLabels

๋ฐ์ดํ„ฐ ๋ผ๋ฒจ์€ ์ฐจํŠธ์—์„œ ์‹œ๋ฆฌ์ฆˆ์— ๋Œ€ํ•œ ๊ฐ’์„ ํ‘œ์‹œํ•œ๋‹ค. dataLabels ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

type options = {
  ...
  series?: {
    dataLabels?: {
      visible?: boolean;
      offsetX?: number;
      offsetY?: number;
      formatter?: (value) => string;
      anchor: 'start' | 'center' | 'end' | 'auto';
      stackTotal?: {
        visible?: boolean;
        formatter?: (value) => string;
      };
    };
  };
};
์ด๋ฆ„ ํƒ€์ž… ์„ค๋ช…
visible boolean ๋ฐ์ดํ„ฐ ๋ผ๋ฒจ ํ‘œ์‹œ ์—ฌ๋ถ€
offsetX number ๋ฐ์ดํ„ฐ ๋ผ๋ฒจ ์œ„์น˜ x ์˜คํ”„์…‹
offsetY number ๋ฐ์ดํ„ฐ ๋ผ๋ฒจ ์œ„์น˜ y ์˜คํ”„์…‹
formatter function ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ๋ฐ›์•„ ์ถœ๋ ฅ ํ˜•์‹ ์ง€์ •
anchor 'start' | 'center' | 'end' | 'auto' ๋ฐ์ดํ„ฐ ๋ผ๋ฒจ ์œ„์น˜ ์„ค์ • (๊ธฐ๋ณธ๊ฐ’: 'auto')
stackTotal object ์Šคํƒ ์ปฌ๋Ÿผ ์ฐจํŠธ์—์„œ ํ•ฉ๊ณ„ ๊ฐ’์— ๋Œ€ํ•œ ๋ผ๋ฒจ ์„ค์ •
stackTotal.visible boolean ํ•ฉ๊ณ„ ๋ผ๋ฒจ ํ‘œ์‹œ ์—ฌ๋ถ€. ์Šคํƒ ์ฐจํŠธ์ผ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ true๊ฐ€ ๋จ
stackTotal.formatter function ํ•ฉ๊ณ„ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ๋ฐ›์•„ ์ถœ๋ ฅ ํ˜•์‹ ์ง€์ •
// ๊ธฐ๋ณธ
const options = {
  series: {
    dataLabels: { visible: true }
  }
};

image

// ์Šคํƒ ์ปฌ๋Ÿผ ์ฐจํŠธ
const options = {
  series: {
    stack: true,
    dataLabels: { visible: true }
  }
};

image

์‹œ๋ฆฌ์ฆˆ theme

Column ์ฐจํŠธ์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๋ฆฌ์ฆˆ ํ…Œ๋งˆ์ด๋‹ค. ๋ฐ์ดํ„ฐ ๋ผ๋ฒจ ์Šคํƒ€์ผ์€ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐ๋ณธ ๋ผ๋ฒจ์„ ํฌํ•จํ•˜์—ฌ, ์Šคํƒ ์ปฌ๋Ÿผ ์ฐจํŠธ์ผ ๊ฒฝ์šฐ ํ‘œ์‹œ๋˜๋Š” ํ•ฉ๊ณ„ ๋ผ๋ฒจ์— ๋Œ€ํ•œ ์Šคํƒ€์ผ๋ง๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ™”์‚ดํ‘œ๊ฐ€ ์žˆ๋Š” ๋งํ’์„  ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

interface BoxChartSeriesTheme {
  barWidth?: number | string;
  areaOpacity?: number;
  colors?: string[];
  hover?: {
    color?: string;
    borderColor?: string;
    borderWidth?: number;
    shadowColor?: string;
    shadowOffsetX?: number;
    shadowOffsetY?: number;
    shadowBlur?: number;
    groupedRect?: {
      color?: string;
      opacity?: number;
    };
  };
  select?: {
    color?: string;
    borderColor?: string;
    borderWidth?: number;
    areaOpacity?: number;
    shadowColor?: string;
    shadowOffsetX?: number;
    shadowOffsetY?: number;
    shadowBlur?: number;
    groupedRect?: {
      color?: string;
      opacity?: number;
    };
    restSeries?: {
      areaOpacity?: number;
    };
  };
  connector?: {
    color?: string;
    lineWidth?: number;
    dashSegments?: number[];
  };
  dataLabels?: CommonDataLabelBubbleTheme & {
     stackTotal?: CommonDataLabelBubbleTheme;
  };
}

type CommonDataLabelBubbleTheme = {
  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;
    arrow?: {
      visible?: boolean;
      width?: number;
      height?: number;
      direction?: 'top' | 'right' | 'bottom' | 'left';
    };
  };
};
์ด๋ฆ„ ํƒ€์ž… ์„ค๋ช…
barWidth number | string ์‹œ๋ฆฌ์ฆˆ ๋ฐ•์Šค ๋„ˆ๋น„
areaOpacity number ๋ชจ๋“  ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ํ™œ์„ฑ ๋˜์–ด ์žˆ์„ ๋•Œ์˜ ์ „์ฒด ์˜์—ญ ํˆฌ๋ช…๋„
colors string[] ์‹œ๋ฆฌ์ฆˆ์˜ ์ƒ‰์ƒ
hover object ๋ฐ์ดํ„ฐ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ ์Šคํƒ€์ผ
hover.groupRect object ์˜ต์…˜ series.eventDetectType: 'grouped'๋กœ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ, X์ถ• ๊ธฐ์ค€์œผ๋กœ ๋ฎ์–ด์ง€๋Š” ๋ฐ•์Šค ์˜์—ญ์˜ ์Šคํƒ€์ผ
select object ์˜ต์…˜ series.selectable: true๋กœ ์„ค์ • ๋˜์–ด ์žˆ์„ ๋•Œ ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ์„ ํƒ ๋˜๋ฉด ์ ์šฉ๋˜๋Š” ์Šคํƒ€์ผ
select.areaOpacity number ์„ ํƒ๋œ ์‹œ๋ฆฌ์ฆˆ์˜ ์˜์—ญ ํˆฌ๋ช…๋„
select.groupRect object ์˜ต์…˜ series.eventDetectType: 'grouped'๋กœ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ, X์ถ• ๊ธฐ์ค€์œผ๋กœ ์„ ํƒ๋˜๋Š” ๋ฐ•์Šค ์˜์—ญ์˜ ์Šคํƒ€์ผ
select.restSeries object ์„ ํƒ๋˜์ง€ ์•Š์€ ์‹œ๋ฆฌ์ฆˆ์˜ ์Šคํƒ€์ผ
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
dataLabels.textBubble.arrow object ๋งํ’์„  ํ™”์‚ดํ‘œ ์„ค์ •
dataLabels.textBubble.arrow.visible boolean ํ™”์‚ดํ‘œ ํ‘œ์‹œ ์—ฌ๋ถ€
dataLabels.textBubble.arrow.width number ํ™”์‚ดํ‘œ ์‚ผ๊ฐํ˜• ๋„ˆ๋น„
dataLabels.textBubble.arrow.height number ํ™”์‚ดํ‘œ ์‚ผ๊ฐํ˜• ๋†’์ด
dataLabels.textBubble.arrow.direction 'top' | 'right' | 'bottom' | 'left' ํ™”์‚ดํ‘œ ๋ฐฉํ–ฅ
dataLabels.stackTotal object ์Šคํƒ ์ฐจํŠธ์—์„œ ํ•ฉ๊ณ„ ๋ผ๋ฒจ ์Šคํƒ€์ผ. dataLabels์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€์ผ ์˜ต์…˜ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

ํ…Œ๋งˆ๋Š” ์˜ต์…˜์—์„œ theme ์˜ต์…˜์„ ์ง€์ •ํ•˜๊ณ  ์‹œ๋ฆฌ์ฆˆ ํ…Œ๋งˆ๋Š” theme.series๋กœ ์„ค์ •ํ•œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” Column ์‹œ๋ฆฌ์ฆˆ์˜ ์ƒ‰์ƒ๊ณผ ๋„ˆ๋น„๋ฅผ ๋ฐ”๊พธ๊ณ , ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•œ ์˜ต์…˜์ด๋‹ค.

const options = {
  theme: {
    series: {
      barWidth: 5,
      colors: ['#EDAE49', '#D1495B', '#00798C', '#30638E'],
      hover: {
        color: '#00ff00',
        borderColor: '#73C8E7',
        borderWidth: 3,
        shadowColor: 'rgba(0, 0, 0, 0.7)',
        shadowOffsetX: 4,
        shadowOffsetY: 4,
        shadowBlur: 6,
      },
    }
  }
};

์˜ต์…˜์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

image

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ฐ์ดํ„ฐ ๋ผ๋ฒจ์˜ ํ…Œ๋งˆ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋งํ’์„ ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๊ธ€์ž ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•œ ์˜ต์…˜์ด๋‹ค.

const options = {
  series: {
    stack: true,
    dataLabels: { visible: true }
  },
  theme: {
    series: {
      dataLabels: {
        fontFamily: 'monaco',
        lineWidth: 2,
        textStrokeColor: '#ffffff',
        shadowColor: '#ffffff',
        shadowBlur: 4,
        stackTotal: {
          fontFamily: 'monaco',
          fontWeight: 14,
          color: '#ffffff',
          textBubble: {
            visible: true,
            paddingY: 6,
            borderWidth: 3,
            borderColor: '#00bcd4',
            borderRadius: 7,
            backgroundColor: '#041367',
            shadowOffsetX: 0,
            shadowOffsetY: 0,
            shadowBlur: 0,
            shadowColor: 'rgba(0, 0, 0, 0)'
          }
        }
      }
    }
  }
};

image