2024.05.22

【LWC】Chart.jsを使用してグラフを描画する

Just a moment... (32256)

はじめに

みなさんは、SalesforceでLightning Web Components(以下LWC)を利用した開発を行ったことがありますか?
LWCでは一般的なHTMLを使用したウェブサイトのように、サードパーティのライブラリを利用して開発をすることも可能です。

今回は、Chart.jsというサードパーティのライブラリを利用して、LWCでグラフを描画する方法をご紹介したいと思います。

Chart.jsとは

Chart.jsは2013年に公開された、オープンソースのライブラリです。
円グラフや折れ線グラフ、棒グラフをはじめとしたさまざまなグラフをJavaScriptで簡易に作成することができます。

Chart.jsを利用するための準備

Chart.jsをLWCで利用するためには、ファイルを静的リソースに保存する必要があります。
その手順を確認していきましょう。

まずは、公式サイトからChart.jsのファイルを保存します。

JsDelivrのFilesタブにある一番上のファイルを、右クリックから保存します。

次に、保存したファイルを静的リソースとしてSalesforceに保存します。

これで準備ができました。
LWCでグラフ描画処理を実装してみましょう!

グラフ描画処理の実装

今回は、売上高を表現する棒グラフを実装してみたいと思います。

LWCを新規作成して、HTMLにグラフを描画するために必要なcanvasを配置します。
<template>
  <lightning-card>
    <canvas width="600" height="300"></canvas>
  </lightning-card>
</template>
chartComponent.html
js側では、先ほど追加したchart.jsファイルを静的リソースからimportします。
importしたchart.jsファイルをplatformResourceLoaderを使用して読み込むことで、グラフの描画ができるようになります。

drawChartメソッド内で、canvas要素を取得してグラフを描画します。
typeでグラフの種類(今回は棒グラフのためbarを指定)、labelsでグラフの横軸の表示ラベル、datasetsでグラフの数値や色を指定します。

今回は割愛しますが、マウスオーバー時のツールチップ表示やグラフの幅など、Chart.jsにはさまざまなプロパティが設定できるようになっているので興味のある方はぜひ調べてみてください。
import { LightningElement } from "lwc";
import { loadScript } from "lightning/platformResourceLoader";
import chartjs from "@salesforce/resourceUrl/chartjsVer442"; //静的リソースからchart.jsファイルをimport

export default class ChartComponent extends LightningElement {
  chart;
  connectedCallback() {
    //chart.jsファイルを読み込む
    loadScript(this, chartjs)
      .then(() => {
        this.drawChart();
      })
      .catch((error) => {
        console.log(error);
      });
  }

  //グラフ描画メソッド
  drawChart() {
    //Canvasを取得
    const ctx = this.template.querySelector("canvas").getContext("2d");
    this.chart = new Chart(ctx, {
      type: "bar",
      //グラフデータ
      data: {
        labels: [
          "1月",
          "2月",
          "3月",
          "4月",
          "5月",
          "6月",
          "7月",
          "8月",
          "9月",
          "10月",
          "11月",
          "12月"
        ],
        datasets: [
          {
            label: "売上高",
            backgroundColor: "rgb(255, 99, 132)",
            borderColor: "rgb(255, 99, 132)",
            data: [
              1000000, 900000, 1300000, 830000, 1000000, 1500000, 2000000,
              1000000, 900000, 1300000, 1800000, 2300000
            ]
          }
        ]
      }
    });
  }
}
chartComponent.js
上記のコードをデプロイして確認してみましょう。

縦軸が売上高、横軸が月の棒グラフを作成することができました。

レコードを用いたグラフの実装

無事グラフをLWCで実装することができました。
ただ、先ほどのグラフはjsに直接売上高の数値を記述してしまっています。
LWCでグラフを表示する場合は、レコードをもとにグラフを作成したいことの方が多いのではないでしょうか。

レコードからデータを取得して、グラフを描画する処理を実装してみましょう。
今回は売上高(AmountOfSales__c)というカスタムオブジェクトのデータを取得して、グラフデータを作成します。

以下の項目値で売上高オブジェクトにレコードを作成します。
月数(Month__c) 1月 2月 3月 4月 5月 6月 7月 8月
売上高(AmountOfSales__c) 1200000 700000 1300000 830000 1000000 1500000 2000000 1000000
9月 10月 11月 12月
900000 1300000 1800000 2300000
次に、グラフデータの取得をするApexクラスを作成します。

getChartDataメソッドが呼び出されると、売上高レコード取得して、横軸のラベルと売上高の数値データを内部クラスの形でリターンします。
public with sharing class ChartComponentController {
  //chartのラベルと数値のリストを持った内部クラス
  public class ChartData {
    @AuraEnabled
    public List<String> chartLabels = new List<String>();
    @AuraEnabled
    public List<Decimal> chartDatasets = new List<Decimal>();
  }

  @AuraEnabled
  public static ChartData getChartData() {
    ChartData chartData = new ChartData();
    //売上高レコードを取得
    List<AmountOfSales__c> records = getRecord();
    //内部クラスにレコードの情報をセット
    for (AmountOfSales__c rec : records) {
      chartData.chartLabels.add(rec.Month__c);
      chartData.chartDatasets.add(rec.AmountOfSales__c);
    }
    return chartData;
  }

  private static List<AmountOfSales__c> getRecord() {
    return [
      SELECT Id, AmountOfSales__c, Month__c
      FROM AmountOfSales__c
      ORDER BY Month__c ASC
    ];
  }
}
ChartComponentController.cls
Apexの作成が終わったら、LWCの修正をしていきます。

先ほど作成したLWCのjsから、新しくApexで作成したgetChartDataメソッドを呼び出すように修正します。
そしてApexから取得したラベル値をdata.labelsに、売上高の数値をdata.datasets.dataに変数としてセットします。
import { LightningElement } from "lwc";
import { loadScript } from "lightning/platformResourceLoader";
import chartjs from "@salesforce/resourceUrl/chartjsVer442"; //静的リソースからchart.jsファイルをimport
import getChartData from "@salesforce/apex/ChartComponentController.getChartData";

export default class ChartComponent extends LightningElement {
  chart;
  labels = [];
  datasets = [];
  connectedCallback() {
    //chart.jsファイルを読み込む
    loadScript(this, chartjs)
      .then(() => {
        //Apexからグラフデータを取得
        getChartData({}).then((result) => {
          this.labels = result.chartLabels; //ラベル値を変数に保持
          this.datasets = result.chartDatasets; //売上高の数値を変数に保持
          this.drawChart();
        });
      })
      .catch((error) => {
        console.log(error);
      });
  }

  //グラフ描画メソッド
  drawChart() {
    //Canvasを取得
    const ctx = this.template.querySelector("canvas").getContext("2d");
    this.chart = new Chart(ctx, {
      type: "bar",
      //グラフデータ
      data: {
        labels: this.labels, //変数を設定
        datasets: [
          {
            label: "売上高",
            backgroundColor: "rgb(255, 99, 132)",
            borderColor: "rgb(255, 99, 132)",
            data: this.datasets //変数を設定
          }
        ]
      }
    });
  }
}
chartComponent.js
jsの修正が終わったらデプロイをして完了です。
レコードのデータからグラフが描画できるようになりました。

確認のために、売上高レコードの数値を変更してみましょう。
12月の売上高を2300000 → 500000に変更してみます。

グラフ画面を再読み込みすると、無事グラフが変更されていることが確認できました!

おわりに

いかがでしたでしょうか。

今回は単純な棒グラフのみ紹介させていただきましたが、Chart.jsにはまだまだたくさんの機能があります。
この記事がみなさんのChart.js活用の手助けになれば幸いです。

最後までお付き合いいただきありがとうございました。
38 件
     
  • banner
  • banner

関連する記事