従来の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を使用しましたが、またの機会に別のグラフも使ってみたいです。
