ngx-chartjsでtimeスケールを使おうとすると、adapterが必要とのエラー

公式のコードサンプルでは X 軸はカテゴリスケールになっている。

https://github.com/scttcper/ngx-chartjs#use

import {
  // 省略
  CategoryScale,
  LinearScale,
  // 省略
} from 'chart.js';
Chart.register(BarController, BarElement, CategoryScale, LinearScale, Title, Tooltip, Legend);

// 省略

const data: ChartData = {
  labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
  // 以下略

X 軸が時系列の折れ線グラフにしたかったので、下記の通り変更。

import {
  Chart,
  LineController,
  LineElement,
  PointElement,
  LinearScale,
  TimeScale,
  Tooltip,
} from 'chart.js';
Chart.register(LineController, LineElement, PointElement, LinearScale, TimeScale, Tooltip);

// データは下記のように Unix タイムスタンプ(ミリ秒) をセット
    const data = this.records.map(record => {
      return {
        x: moment(record.date).valueOf(),
        y: record.value,
      }
    });

ただ、これだけだと実行時にエラーになる。

zone.js:1061 Unhandled Promise rejection: This method is not implemented: Check that a complete date adapter is provided. ; Zone: <root> ; Task: Promise.then ; Value: Error: This method is not implemented: Check that a complete date adapter is provided.
    at abstract (chart.mjs:4151:9)
    at DateAdapter.formats (chart.mjs:4159:12)
    at TimeScale.init (chart.mjs:10406:42)
    at chart.mjs:5601:13
    at each (helpers.segment.mjs:60:12)
    at Chart.buildOrUpdateScales (chart.mjs:5579:9)
    at Chart._updateScales (chart.mjs:5726:10)
    at Chart.update (chart.mjs:5687:10)
    at new Chart (chart.mjs:5476:12)
    at ctrl-ngx-chartjs.mjs:36:34 Error: This method is not implemented: Check that a complete date adapter is provided.
    at abstract (http://localhost:4200/vendor.js:202509:9)
    at DateAdapter.formats (http://localhost:4200/vendor.js:202520:12)
    at TimeScale.init (http://localhost:4200/vendor.js:210870:98)
    at http://localhost:4200/vendor.js:204396:13
    at each (http://localhost:4200/vendor.js:211549:12)
    at Chart.buildOrUpdateScales (http://localhost:4200/vendor.js:204370:67)
    at Chart._updateScales (http://localhost:4200/vendor.js:204576:10)
    at Chart.update (http://localhost:4200/vendor.js:204511:10)
    at new Chart (http://localhost:4200/vendor.js:204234:12)
    at http://localhost:4200/vendor.js:186409:29

Chart.js のドキュメントを見ると「Date ライブラリ」と「対応する Adapter」が必要とのこと。

https://www.chartjs.org/docs/latest/axes/cartesian/time.html#date-adapters

元々 Moment.js を使っていたので、npm install chartjs-adapter-moment し、app.module.ts でインポート。

import {
  Chart,
  LineController,
  LineElement,
  PointElement,
  LinearScale,
  TimeScale,
  Tooltip,
} from 'chart.js';
Chart.register(LineController, LineElement, PointElement, LinearScale, TimeScale, Tooltip);
import 'chartjs-adapter-moment';

ようやく表示できた。

コメントを残す