家計簿アプリを作る #27:収支グラフの表示

家計簿アプリ作成シリーズの第27回です。Chart.js を使って月別の収支を棒グラフで可視化します。

ライブラリのインストール

npm install chart.js svelte-chartjs

chart.js がグラフ本体、svelte-chartjs が Svelte 用のラッパーコンポーネントです。

実装

インポートと登録

<script lang="ts">
  import { Bar } from "svelte-chartjs";
  import {
    Chart,
    BarElement,
    CategoryScale,
    LinearScale,
    Tooltip,
    Legend,
  } from "chart.js";

  Chart.register(BarElement, CategoryScale, LinearScale, Tooltip, Legend);
</script>

Chart.js はデフォルトでは全機能を含まず、使う機能を Chart.register() で明示的に登録する必要があります。これによりバンドルサイズを小さく抑えられます。

登録するもの 役割
BarElement 棒グラフの棒を描画する
CategoryScale X軸のカテゴリスケール(文字列ラベル)
LinearScale Y軸の数値スケール
Tooltip ホバー時のツールチップ
Legend グラフの凡例

円グラフ(Pie)を使う場合は BarElement の代わりに ArcElement を登録します。CategoryScaleLinearScale は不要です。

chartData の構造

const chartData = $derived({
  labels: ["収入", "支出"],
  datasets: [
    {
      label: data.selectedMonth ?? "",
      data: [data.totalIncome, data.totalExpense],
      backgroundColor: ["rgba(34, 197, 94, 0.5)", "rgba(239, 68, 68, 0.5)"],
      borderColor: ["rgb(34, 197, 94)", "rgb(239, 68, 68)"],
      borderWidth: 1,
    },
  ],
});
  • labels: X軸のラベル。datasets.data と同じ順番で対応します
  • datasets.label: 凡例に表示されるラベル。選択中の年月をセットしています
  • datasets.data: 数値データ。labels と対応する順番で指定します
  • backgroundColor: 棒の塗りつぶし色。rgba() で透明度を指定できます
  • borderColor: 棒の枠線の色
  • borderWidth: 枠線の太さ

色は Tailwind の green-50034, 197, 94)と red-500239, 68, 68)を使っています。

$derived にすることで月を切り替えたときに自動的にグラフが更新されます。

テンプレート

<div>
  <Bar data={chartData} />
</div>

まとめ

ポイント 内容
ライブラリ chart.js + svelte-chartjs
機能登録 Chart.register() で使う機能だけ登録してバンドルサイズを削減
データ更新 $derived で月切り替え時に自動更新
色指定 rgba() で透明度付きの色を指定
← トップページに戻る