관리자 대시보드
지표명, 큰 숫자, 전월 대비 증감, 기준선까지. 카드 하나로 KPI 화면이 끝납니다.
createChart('#sales', {
type: 'bar', title: '월별 매출',
value: 48250000, prefix: '₩ ', delta: 18.2,
scale: 1e6, unit: '백만원',
data,
});아래 차트는 모두 실제로 동작합니다. 올려 보고, 범례를 눌러 보고, 방문자 차트는 끌어서 확대해 보세요.
지표명, 큰 숫자, 전월 대비 증감, 기준선까지. 카드 하나로 KPI 화면이 끝납니다.
createChart('#sales', {
type: 'bar', title: '월별 매출',
value: 48250000, prefix: '₩ ', delta: 18.2,
scale: 1e6, unit: '백만원',
data,
});"단위: 백만원"과 콤마 숫자. 내보내기 메뉴에서 PNG·SVG·CSV·엑셀(xlsx)로 바로 내려받습니다.
createChart('#report', {
type: 'line', footnote: '단위: 백만원',
scale: 1e6, unit: '백만원',
data,
});상품 TOP 10은 가로 막대, 결제 수단은 도넛, 일별 매출은 막대와 선 콤보.
createChart('#top', {
type: 'bar', horizontal: true,
dataLabels: true, unit: '개',
data,
});DOM 없이 SVG 문자열을 만듭니다. Cloudflare Workers, Node, Astro에서 OG 이미지나 메일 본문으로.
import { renderToSVG } from '@82chart/core';
const svg = renderToSVG(options, {
width: 1200, height: 630,
});// Chart.●s: 만·억 단위는 직접 만들어야 합니다
scales: { y: { ticks: { callback: (v) =>
v >= 1e8 ? (v / 1e8).toFixed(1) + '억'
: v >= 1e4 ? (v / 1e4).toFixed(0) + '만'
: v.toLocaleString() } } }// 82chart: 한국어 페이지라면 기본값
createChart('#el', { type: 'bar', unit: '원', data });
// 축 0원 · 1,500만원 · 3,000만원 · 4,500만원
// 툴팁 48,250,000원To●●t UI Chart는 2026년 9월 저장소가 보관되어 더 고쳐지지 않습니다. labels와 series 모양이 비슷해서 데이터는 거의 그대로 옮겨집니다.
<link rel="stylesheet" href="https://uicdn.toast.com/chart/latest/to●●tui-chart.min.css">
<script src="https://uicdn.toast.com/chart/latest/to●●tui-chart.min.js"></script>
<div id="chart"></div>
<script>
// columnChart = vertical bars (barChart is horizontal there)
const chart = to●●tui.Chart.columnChart({
el: document.getElementById('chart'),
data: {
categories: ['1월', '2월', '3월'],
series: [{ name: '매출', data: [32000000, 41000000, 38500000] }],
},
options: { chart: { title: '월별 매출', width: 600, height: 400 }, yAxis: { title: '원' } },
});
</script><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@82chart/core@0.5.0/dist/cdn/82chart.css">
<script src="https://cdn.jsdelivr.net/npm/@82chart/core@0.5.0/dist/cdn/82chart.min.js"></script>
<div id="chart"></div>
<script>
const chart = Chart82.createChart('#chart', {
type: 'bar',
title: '월별 매출',
unit: '원',
height: 400,
data: {
labels: ['1월', '2월', '3월'],
series: [{ name: '매출', data: [32000000, 41000000, 38500000] }],
},
});
</script>const chart = new Apex●●●rts(document.querySelector('#chart'), {
chart: { type: 'line', height: 350, zoom: { enabled: true } },
series: [{ name: 'Visitors', data: [120, 180, 150, 220] }],
xaxis: { categories: ['Mon', 'Tue', 'Wed', 'Thu'] },
yaxis: { labels: { formatter: (v) => v.toLocaleString() } },
});
chart.render();const chart = createChart('#chart', {
type: 'line',
height: 350,
zoom: true,
numberFormat: 'comma',
data: {
labels: ['Mon', 'Tue', 'Wed', 'Thu'],
series: [{ name: 'Visitors', data: [120, 180, 150, 220] }],
},
});<canvas id="chart"></canvas>
<script>
new Chart(document.getElementById('chart'), {
type: 'bar',
data: { labels: ['1월', '2월', '3월'], datasets: [{ label: '매출', data: [12, 19, 14] }] },
});
</script><div id="chart"></div>
<script>
Chart82.createChart('#chart', {
type: 'bar',
data: { labels: ['1월', '2월', '3월'], series: [{ name: '매출', data: [12, 19, 14] }] },
});
</script><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@82chart/core@0.5.0/dist/cdn/82chart.css">
<script src="https://cdn.jsdelivr.net/npm/@82chart/core@0.5.0/dist/cdn/82chart.min.js"></script>
<div id="chart"></div>
<script>
Chart82.createChart('#chart', {
type: 'bar',
title: '월별 매출',
unit: '원',
data: {
labels: ['1월', '2월', '3월', '4월', '5월', '6월'],
series: [{ name: '매출', data: [32000000, 41000000, 38500000, 52000000, 61000000, 58000000] }],
},
});
</script>import { createChart } from '@82chart/core';
import '@82chart/core/styles.css';
const chart = createChart('#chart', {
type: 'bar',
title: '월별 매출',
unit: '원',
data: {
labels: ['1월', '2월', '3월', '4월', '5월', '6월'],
series: [{ name: '매출', data: [32000000, 41000000, 38500000, 52000000, 61000000, 58000000] }],
},
});
chart.on('click', (point) => console.log(point.x, point.y));import { Chart82 } from '@82chart/react';
import '@82chart/core/styles.css';
const data = {
labels: ['1월', '2월', '3월', '4월', '5월', '6월'],
series: [{ name: '매출', data: [32000000, 41000000, 38500000, 52000000, 61000000, 58000000] }],
};
export function SalesChart() {
return (
<Chart82
type="bar"
data={data}
options={{ title: '월별 매출', unit: '원' }}
onClick={(point) => console.log(point)}
/>
);
}<script setup>
import { Chart82 } from '@82chart/vue';
import '@82chart/core/styles.css';
const data = {
labels: ['1월', '2월', '3월', '4월', '5월', '6월'],
series: [{ name: '매출', data: [32000000, 41000000, 38500000, 52000000, 61000000, 58000000] }],
};
const options = { title: '월별 매출', unit: '원' };
</script>
<template>
<Chart82 type="bar" :data="data" :options="options" @click="(p) => console.log(p)" />
</template><script>
import { Chart82 } from '@82chart/svelte';
import '@82chart/core/styles.css';
const data = {
labels: ['1월', '2월', '3월', '4월', '5월', '6월'],
series: [{ name: '매출', data: [32000000, 41000000, 38500000, 52000000, 61000000, 58000000] }],
};
</script>
<Chart82 type="bar" {data} options={{ title: '월별 매출', unit: '원' }} />import { Component } from '@angular/core';
import { Chart82Component } from '@82chart/angular';
import type { ChartData, ChartOptions, ChartPoint } from '@82chart/core';
@Component({
selector: 'app-sales',
standalone: true,
imports: [Chart82Component],
template: `<chart-82 type="bar" [data]="data" [options]="options" (pointClick)="onPoint($event)"></chart-82>`,
})
export class SalesComponent {
data: ChartData = {
labels: ['1월', '2월', '3월', '4월', '5월', '6월'],
series: [{ name: '매출', data: [32000000, 41000000, 38500000, 52000000, 61000000, 58000000] }],
};
options: Partial<ChartOptions> = { title: '월별 매출', unit: '원' };
onPoint(p: ChartPoint) { console.log(p); }
}
// angular.json → "styles": ["node_modules/@82chart/core/dist/styles.css"]<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@82chart/core@0.5.0/dist/cdn/82chart.css">
<script src="https://cdn.jsdelivr.net/npm/@82chart/core@0.5.0/dist/cdn/82chart.min.js"></script>
<chart-82
type="bar"
title="월별 매출"
unit="원"
data='{"labels":["1월","2월","3월"],"series":[{"name":"매출","data":[32000000,41000000,38500000]}]}'
></chart-82>82chart는 만·억·조 단위와 한국어 날짜를 기본 지원하는 무료(MIT) SVG 차트 라이브러리입니다. 선·막대·파이·도넛·히트맵·트리맵·워터폴 등 14가지 차트에 확대, 크로스헤어 툴팁, 주석, PNG·SVG·CSV 내보내기, 키보드 접근성, 서버 렌더링이 유료 등급 없이 들어 있고, React·Vue·Svelte·Angular 래퍼와 <chart-82> 웹 컴포넌트가 있습니다.
네. MIT 라이선스라 상업용 사이트, 사내 시스템, 납품하는 프로젝트 어디에나 무료입니다. 라이선스 키, 워터마크, 매출 기준, 유료 등급이 없습니다. 라이선스 문구만 함께 두면 됩니다.
아니요. 최신 Chrome, Edge, Safari, Firefox, 삼성 인터넷과 그 모바일 브라우저를 지원합니다. IE11은 마이크로소프트도 지원을 끝냈고, 82chart가 쓰는 SVG·ResizeObserver 기능이 없습니다.
82chart.min.js 가 gzip 으로 약 59KB(0.5, 14가지 차트와 실시간·엑셀 내보내기·추세선 전부), CSS가 약 4.4KB입니다. 번들러에서 @82chart/core/lite 로 쓰는 차트만 넣으면 막대·선 페이지가 약 37KB 입니다(필요한 차트만 불러오기). 의존성이 없어서 날짜 라이브러리나 jQuery를 따로 받지 않습니다.
아무것도 하지 않아도 됩니다. 페이지가 한국어(<html lang="ko">)이거나 language: 'ko' 면 축은 1.2만·3.4억, 툴팁은 쉼표가 든 전체 숫자입니다. 보고서처럼 "단위: 백만원"을 쓰려면 scale: 1000000, unit: '백만원' 입니다.
단위가 다른 두 값(매출과 주문 수)을 한 그림에 겹치면, 두 축의 범위를 어떻게 잡느냐에 따라 같은 데이터가 "함께 오른다"로도 "엇갈린다"로도 보입니다. 차트가 가장 자주 잘못 읽히는 경우라서 0.2.0 부터 직접 켜는 옵션으로만 넣었습니다. 시리즈에 axis: 'right' 를 주면 오른쪽 축이 생기고, y2Axis 로 단위와 제목을 정합니다(콤보 차트). 비교가 목적이면 같은 x를 공유하는 차트 두 개를 위아래로 놓고 group 으로 크로스헤어를 묶는 방법이 더 정직합니다.
수천 개까지는 SVG로 부드럽게 그립니다. 선·영역은 2,000개가 넘으면 LTTB 로 그림 폭만큼 줄여 그리고, 모두 합쳐 5,000개가 넘으면 자리 표시 → 거친 그림 → 전체 그림 순서로 점진 렌더링하므로 수만 개도 가볍습니다(많은 점, CSV·표는 원본 그대로). 막대 수천 개나 수십만 개 이상은 미리 묶어서 넘기세요.
있습니다(0.5부터). 코어 위에 얹는 별도 패키지 @82chart/stock 이 캔들과 OHLC 차트, 거래량, 이동평균(SMA·EMA), 한국식 색(양봉 빨강·음봉 파랑), 실시간 틱을 그립니다. 코어와 같은 MIT 라 무료입니다. 그리기 도구와 RSI·MACD 같은 다른 보조지표는 없으니, 그런 매매 화면에는 light●●●ght-charts(Apache-2.0, 화면에 Trading●iew 표시 필요) 같은 금융 전용 라이브러리가 맞습니다(주식 차트).
간트 차트는 지원하지 않고 계획도 없습니다(일정 관리 전용 도구가 낫습니다). 대한민국 시도·시군구 지도는 아직 없으며, 코어와 분리한 별도 패키지로 준비하고 있습니다.
아니요. 차트 데이터와 방문자 정보는 보내지 않습니다. 하루 한 번 차트가 실행된 도메인과 버전만 82chart.com에 알리며, telemetry: false 로 끌 수 있습니다. localhost, 사내 주소, IP 주소에서는 보내지 않습니다.
네. realtime 옵션을 주고 chart.append(points) 로 점을 이어 붙이면 오래된 점은 창(window, duration) 밖으로 빠지고, chart.update() · setValue() 는 파이·게이지·트리맵까지 14가지 차트 모두에서 부드럽게 바뀝니다. SSE·WebSocket 예제는 실시간 차트에 있습니다.
네. theme: 'krds' 를 주면 KRDS 공식 토큰의 회색·글자색과, KRDS 원색에서 고른 6색 팔레트(색약 검사 통과)로 그립니다(테마와 색).
네. yAxis: { type: 'log' } 는 1 · 10 · 100 · 1만 · 100만 · 1억 같은 눈금으로, 0이나 음수가 있으면 'symlog' 를 씁니다(축 다루기).
네. 인터넷이 없는 곳에서는 CDN 파일 문서의 오프라인 묶음(zip, SHA-256 포함)을 반입해 쓰세요. 사용 통계는 IP 주소, 점 없는 호스트 이름, .local · .internal · .corp · .lan · .intra 같은 내부 이름에서 처음부터 보내지 않으므로 망 밖으로 나가는 요청이 없습니다. 보안 점검에서 확인이 필요하면 페이지 전체에 <html data-82chart-telemetry="off"> 를 넣어 두면 어떤 주소에서도 보내지 않습니다. 'unsafe-inline' 없는 CSP 와 Trusted Types 에서도 동작하고(보안), KRDS 색 테마(theme: 'krds'), 색 없이도 구분되는 무늬(patterns), 인쇄용 스타일, 확대 단추(KWCAG 6.5.1)도 있습니다.
네. To●●t UI Chart 저장소는 2026년 9월에 보관(archived) 처리되어 더 이상 고쳐지지 않습니다. 82chart는 같은 한국형 쓰임새(만·억 단위, 한글 라벨, 관리자 대시보드)를 목표로 하고, 옵션 대응표는 To●●t UI Chart에서 옮기기에 있습니다.
Apex●●●rts는 5.0부터 MIT가 아닌 라이선스로 바뀌었고, Chart.●s는 확대나 주석을 별도 플러그인으로 붙여야 합니다. 82chart는 확대, 크로스헤어, 주석, PNG·SVG·CSV 내보내기, 만·억 단위가 MIT 코어에 모두 들어 있습니다. 자세한 비교는 비교 페이지에 있습니다.
가입도 키도 필요 없습니다. 회사 사이트도 무료입니다.
시작하기