Nuxt3とChart.jsで積み上げ棒グラフ
Chart.jsで積み上げ棒グラフを表示するプログラムに挑戦してみました!
今回はVue3、Nuxt3、TypeScriptの組み合わせで実装しており、
基準線を表示するプラグインをインストールしています。
下記コマンドでインストールします。
npx nuxi init my-nuxt3-project
cd my-nuxt3-project
npm install
npm i vue-chartjs chart.js
npm install @types/chart.js
npm install chartjs-plugin-annotation
components/StackedBarChart.vue
棒グラフのX軸とY軸のstackedをtrueに設定することで積み上げグラフになります。
今回はプラグインで閾値を設定して基準線を表示し、tooltipで合計値を計算して表示しています。
<template>
<div>
<Bar :data="chartData" :options="chartOptions" />
</div>
</template>
<script setup lang="ts">
import { Bar } from 'vue-chartjs';
import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, CategoryScale, LinearScale } from 'chart.js';
import annotationPlugin from 'chartjs-plugin-annotation';
ChartJS.register(Title, Tooltip, Legend, BarElement, CategoryScale, LinearScale, annotationPlugin);
const chartData = ref<any>({
labels: ['January', 'February', 'March', 'April', 'May', 'June'],
datasets: [
{
label: 'Dataset 1',
data: [10, 20, 30, 40, 50, 60],
backgroundColor: 'rgba(255, 99, 132, 0.2)',
borderColor: 'rgba(255, 99, 132, 1)',
borderWidth: 1,
},
{
label: 'Dataset 2',
data: [15, 25, 35, 45, 55, 65],
backgroundColor: 'rgba(54, 162, 235, 0.2)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1,
},
],
});
const chartOptions = ref<any>({
responsive: true,
scales: {
x: {
stacked: true,
},
y: {
stacked: true,
},
},
plugins: {
tooltip: {
callbacks: {
footer: (tooltipItems: any) => {
const label = tooltipItems[0].label;
const datasets = chartData.value.datasets;
let sum = 0;
datasets.forEach((dataset: any) => {
const dataIndex = chartData.value.labels.indexOf(label);
sum += dataset.data[dataIndex];
});
return `Total: ${sum}`;
},
},
},
annotation: {
annotations: {
thresholdLine: {
type: 'line',
yMin: 50, // 閾値の値
yMax: 50,
borderColor: 'red',
borderWidth: 2,
label: {
content: 'Threshold',
enabled: true,
position: 'center',
},
},
},
},
},
});
</script>
pages/Chart.vue
今回のサンプルのメインページです。
上記で作成したStackedBarChartコンポーネントをインポートして表示しています。
<template>
<div>
<StackedBarChart />
</div>
</template>
<script setup lang="ts">
import StackedBarChart from '~/components/StackedBarChart.vue';
</script>
nuxt.config.ts
nuxt.config.tsファイルに必要な設定を追加します。
export default defineNuxtConfig({
build: {
transpile: ['vue-chartjs', 'chart.js'],
},
});
以下が実行結果です。積み上げ棒グラフが表示されました!
積み上げ棒グラフの場合、ツールチップの合計値を表示するためには、
ツールチップの footer コールバック関数内で、特定のラベルに関連するすべてのデータセットを手動で計算する必要があるようです。
ここのやり方が分からず悩んでしまいました・・・
さて、ポンコツ2人組は今回のサンプルプログラムを理解できたのでしょうか?
Chart.jsを利用すると簡単にチャートを実装できてしまいます。また、設定項目が多く、いろいろな事が実現できるので 興味がある人は是非チャレンジしてみてくださいね!