Webプログラミング

ReactでamCharts4を使う

従来のJavascript環境ではD3.jsなど多くのデータ可視化ライブラリが利用可能でしたが、Reactで使うとなると使うことの出来るライブラリは限られてきます。

色々と探してみたのですが、私はamChartsという可視化ライブラリを使用してみました。

公式サイトは以下のリンクから。

 

インストール&セットアップ

# npm または yarn でインストール 
npm install @amcharts/amcharts4 
# yarn add @amcharts/amcharts4

まずは必要なライブラリをインポート。今回はマインドマップ的なものを作りたかったのでForce Directed Treeを追加でインポートしています。必要に応じてモジュールをインポートしましょう。

ポイント

公式ではモジュールのインポートの際にリネームしています(下記コードを参照)。公式ドキュメントで示されている通りにインポートしたほうがいいでしょう。

// 必要となるモジュールをインポートする。 
import * as am4core from "@amcharts/amcharts4/core"; 
import * as am4plugins_forceDirected from "@amcharts/amcharts4/plugins/forceDirected"; 
import am4themes_animated from "@amcharts/amcharts4/themes/animated"; 

am4core.useTheme(am4themes_animated);

実装

大まかに言うとcomponentDidMountでデータの取得(必要なら非同期通信で)とグラフの作成を行い、componentWillUnmountでクリーンナップを行います。

基本的には公式ドキュメントの通りにすればそのまま動きます。

補足

公式ドキュメントはメニューの「Docs」→左側メニューの「Chart Types」から作りたいグラフのドキュメントが見られます。

class ForceDirectedTree extends Component {
  componentDidMount() {
    let chart = am4core.create(
      "chartdiv",
      am4plugins_forceDirected.ForceDirectedTree
    );

    // 表示するデータ
    chart.data = [
      {
        name: "Core",
        children: [
          {
            name: "First",
            children: [
              { name: "A1", value: 100 },
              { name: "A2", value: 60 }
            ]
          },
          {
            name: "Second",
            children: [
              { name: "B1", value: 135 },
              { name: "B2", value: 98 }
            ]
          },
          // 以下略...
        ]
      }
    ]  
    // 下のコードに続く
     

データに関してはname, childrenという要素が基本になっており、グラフの「葉」のノードはvalueを持っています。

このvalueがノードの大きさを表し、親要素は子要素のvalueの合計になっていきます。

補足

nameやchildren、valueといったkeyは決められているわけではなく、後で設定することが出来るので好きなkeyで大丈夫です。

ここからは使用するグラフによって書き方は変わりますが、Force Directed Treeでは一つ以上のseriesというオブジェクトを作成する必要があります。

また、ここでツールチップなどの各種設定を行います。

  // ComponentDidMountの続き
  var networkSeries = chart.series.push(
    new am4plugins_forceDirected.ForceDirectedSeries()
  );
  // ここでデータのkeyを設定する。
  networkSeries.dataFields.value = "value";
  networkSeries.dataFields.name = "name";
  networkSeries.dataFields.children = "children";
  networkSeries.nodes.template.tooltipText = "{name}:{value}";
  networkSeries.nodes.template.fillOpacity = 1;
  networkSeries.manyBodyStrength = -20;
  networkSeries.links.template.strength = 0.8;
  networkSeries.minRadius = am4core.percent(2);
  networkSeries.nodes.template.label.text = "{name}";
  networkSeries.fontSize = 10;

  this.chart = chart;
}

上のコードの中のこの部分がデータのkeyを設定しているところ。value, name, childrenというkeyを設定しています。

networkSeries.dataFields.value = "value";
networkSeries.dataFields.name = "name";
networkSeries.dataFields.children = "children";

例えばデータの数値(valueにあたるもの)がamountというkeyであれば、以下のように書きます。

networkSeries.dataFields.value = "amount";

あとはunmountでクリーンナップを行い、renderメソッド内で描画するためのdiv要素を書くだけ。

componentWillUnmount() {
    if (this.chart) {
      this.chart.dispose();
    }
  }

  render() {
    return (
      <div
        id="chartdiv"
        style={{ width: "100%", height: "550px" }}
      ></div>
    );
  }
}

export default ForceDirectedTree;

 

完成したグラフ

チャート完成図

完成するとこのように綺麗なグラフが表示されます。クリックするとアニメーションでノードの出し入れが出来るのでいい感じです。

まとめ

ReactでamCharts4を使う方法を紹介しました。

イベントリスナーに関することや、ツールチップのカスタマイズは次の記事にします。

今回はForce Directed Treeを使用しましたが、またの機会に別のグラフも使ってみたいです。

この記事は参考になりましたか?

下記のボタンよりアンケートにご協力お願いします。

-Webプログラミング
-, ,

© 2020 エンジニアの本棚