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

※この記事は2024/08/01時点の情報です。

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'],
  },
});

以下が実行結果です。積み上げ棒グラフが表示されました!

Nuxt3とChart.jsで積み上げ棒グラフ

積み上げ棒グラフの場合、ツールチップの合計値を表示するためには、 ツールチップの footer コールバック関数内で、特定のラベルに関連するすべてのデータセットを手動で計算する必要があるようです。 ここのやり方が分からず悩んでしまいました・・・
さて、ポンコツ2人組は今回のサンプルプログラムを理解できたのでしょうか?

Nuxt3とChart.jsで積み上げ棒グラフを表示するプログラムを覚えられましたか?

Chart.jsを利用すると簡単にチャートを実装できてしまいます。また、設定項目が多く、いろいろな事が実現できるので 興味がある人は是非チャレンジしてみてくださいね!

管理人情報