ブレインズテクノロジーの加藤です。
例年以上に暑い日々が続いていますが、如何お過ごしでしょうか。
ブレインズテクノロジーでは、そんな暑い夏にも負けないくらいの空前のボルダリング熱波が巻き起こっています。
週に1回、有志でジムに通っていますが、いい運動になりますし、課題をクリアしたときの達成感はひとしおです。
さて今回は、AngularでPlotlyを動かしてグラフ描画する方法についてまとめます。
はじめに
Angularを触ったことのない人には、下記のチュートリアルがおすすめです。
ヒーローがどうのこうのという謎アプリを作らされますが、何となくのイメージが掴めると思います。
新しいアプリケーションを作成
下記のコマンドで、新しいアプリケーションを作ります。
名前は何でもいいですが、今回はとりあえず「angular-plotly」とします。
$ ng new angular-plotly
Plotlyファイルのimport
先ほど作った「angular-plotly」下に移動し、npm経由でplotlyの型定義ファイルを取得します。
$ cd angular-plotly $ npm install plotly.js --save $ npm install @types/plotly.js --save
Plotlyによるグラフ描画の実装
シンプルに下記サンプルの棒グラフ「Basic Bar Chart」を描画します。
グラフ出力時のデータなどは、サイトの情報をそのまま用いることにします。
Javascript Graphing Library D3.js-based Bar Charts | Examples | Plotly
ここからは、実際のtypescriptのコードとhtmlファイルを記載します。
- src/app/app.component.ts
import { Component, OnInit } from '@angular/core'; import * as Plotly from 'plotly.js'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit { ngOnInit() { const data = [ { x: ['giraffes', 'orangutans', 'monkeys'], y: [20, 14, 23], type: 'bar' } as Plotly.ScatterData ]; Plotly.newPlot('myDiv', data); } }
- src/app/app.component.html
<div id='myDiv'></div>
解説
簡単にコードを解説します。
import * as Plotly from 'plotly.js';
で、先程npm経由で取得したplotlyを呼べるようにしています。
また、
import { Component, OnInit } from '@angular/core';
で、起動時の動作を定義するインターフェース「OnInit」をimportしています。
「OnInit」をimplementsした「ngOnInit」関数にてPlotly描画の定義をすることにより、Angular起動と同時にグラフ描画処理が実行されます。
export class AppComponent implements OnInit { ngOnInit() { const data = [ { x: ['giraffes', 'orangutans', 'monkeys'], y: [20, 14, 23], type: 'bar' } as Plotly.ScatterData ]; Plotly.newPlot('myDiv', data); } }
「ngOnInit」関数で定義している内容は、前述の「Basic Bar Chart」のJSコードを一部改変したものです。
Plotlyで描画する際に、dataの型を「Plotly.ScatterData」に変換しています。
Angular起動
下記のコマンドを実行することにより、Angularが起動します。
$ ng serve --open
・・・が、画面に何も描写されないと思います。
デベロッパーツールで確認すると、下記のようなエラーが出ています。
Uncaught ReferenceError: global is not defined
回避策として、src/polyfills.tsの文末に以下を記載します。
// "global is not defined"の対応 (window as any).global = window;
この状態で再起動すると、無事にグラフが描画されました。
おわりに
今回は最もシンプルなグラフを生成しましたが、同じ要領でいろいろなグラフが生成出来ると思います。
おわり。
ブレインズテクノロジーでは「共に成長できる仲間」を募集中です。
採用ページはこちら