ユーザーアイコン

mizuko

約1か月前

0
0

Chart.jsのグラデーション実装

Chart.js
React
フロントエンド
JavaScript

Chart.jsのLineグラフでグラデーション背景を実装するための基本的な方法と注意点をまとめる。

実装例

// 必要なコンポーネントのインポート import { Chart as ChartJS, CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend, Filler, // グラデーション塗りつぶしに必須 } from 'chart.js'; import { Line } from 'react-chartjs-2'; // 必要なコンポーネントの登録 ChartJS.register( CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend, Filler // 塗りつぶしに必要 ); // データセットの設定 const data = { labels: ['1月', '2月', '3月', '4月', '5月', '6月'], datasets: [ { label: 'データ', data: [65, 78, 52, 91, 43, 66], borderColor: 'rgb(53, 162, 235)', // グラデーション設定 backgroundColor: function(context) { const chart = context.chart; const {ctx, chartArea} = chart; if (!chartArea) { return 'rgba(53, 162, 235, 0.3)'; } // グラデーションの作成 const gradient = ctx.createLinearGradient(0, chartArea.bottom, 0, chartArea.top); gradient.addColorStop(0, 'rgba(53, 162, 235, 0)'); // 下部は透明 gradient.addColorStop(0.5, 'rgba(53, 162, 235, 0.3)'); // 中央は半透明 gradient.addColorStop(1, 'rgba(53, 162, 235, 0.6)'); // 上部はより不透明 return gradient; }, tension: 0.4, fill: true, // 塗りつぶしを有効化 } ], }; // コンポーネントの実装 function GradientChart() { return <Line data={data} />; }

注意点

  1. Fillerコンポーネントの登録

    • グラデーション塗りつぶしにはFillerコンポーネントの登録が必須
    • 登録忘れが最も多い問題の原因
  2. コンテキスト依存のグラデーション

    • グラデーションはキャンバスコンテキストに依存するため、関数として定義する必要がある
    • 単純な文字列や配列では設定できない
  3. チャートエリアの確認

    • chartAreaが存在しない場合のフォールバック処理を必ず入れる
    • 初期レンダリング時にchartAreaが未定義の場合がある
  4. グラデーションの方向

    • 垂直グラデーション: (0, chartArea.bottom, 0, chartArea.top)
    • 水平グラデーション: (chartArea.left, 0, chartArea.right, 0)
  5. アップデートの問題

    • グラデーションが正しく描画されない場合は、描画後にchart.update()を呼び出す
    • コンポーネントのアンマウント時にタイムアウトをクリアする
  6. TypeScript対応

    • コンテキスト型はScriptableContext<'line'>を使用
    • 戻り値型はstring | CanvasGradientを指定
  7. Chart.jsのバージョン互換性

    • v3以降では明示的なコンポーネント登録が必要
    • v2では自動的に登録されていた機能がある