Node-REDダッシュボードを用いたデータ可視化

株式会社日立製作所 西山博泰

# はじめに

[Node-RED](https://nodered.org/)はコーディングレスでプログラムを作成できるプログラミングツールです。さまざまな機能を提供するノードをつなぎ合わせることで、とても簡単にプログラムを作成することができます。

Node-REDの特徴の一つとしてUI部品を実現するノードの組み合わせでダッシュボード画面を簡単に作成できることがあげられます。[Node-RED Dashboard](https://github.com/node-red/node-red-dashboard)ダッシュボード提供された基本UI部品しか利用できませんでしたが、バージョン2.10.0からは新しいUI部品を定義するためのAPIを整備しました。この開発には筆者参加しました。

このUI部品定義のためのAPIを用いることで、基本部品に加えて、UI部品を新しく作成し公開できるようになりました。リスト、テーブル、SVG図形、メディア、地図表示など、さまざまなUI部品がコミュニティで活発に作成され公開されています。

この記事では、そのようなノードの一例として、筆者が開発に参加したデータ可視化のためのUI部品であるVegaノードを紹介します。

# Vegaノード

[Vega](https://vega.github.io/vega/)は可視化文法(Visualization Grammar)と呼ばれるデータ可視化を行うための仕様定義とそれを解釈する可視化ライブラリであり、ワシントン大学のInteractive Data Labを中心に開発されています。VegaではJSONを用いてる宣言的な記法によって多様なデータ可視化を指定することができます。VegaライブラリはJavaScriptによって実装されていますが、PythonやRといった言語のバインディングも利用できます。

Vegaノード([`node-red-node-ui-vega`](https://flows.nodered.org/node/node-red-node-ui-vega))
はNode-REDダッシュボード上でVegaによるデータ可視化を行えるようにするためのノードです。Vegaノードは、Vega(もしくは簡易版のVega-Lite)による可視化記述を受け付け、それをNode-REDダッシュボード上に出力します。

以下にVegaノードによるデータ可視化の例を示します。

![vega-example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546217/abfdb852-8c64-4726-7954-6bd85970c201.png)

これらの例は、Vegaノードと一緒に配布されており、Vegaノードをインストールすると、Node-REDの「**読み込み**→**サンプル**→`nod-red-node-ui-vega`」から参照できます。

VegaノードはJSONによる可視化記述をノードの設定パネル、もしくは、入力メッセージから与えます。次の図は、Vegaノードの設定パネルの例です。

![vega-config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546217/c1d3296c-4329-af8a-6607-4aac45f98647.png)
 
# Vegaノードによる可視化の例
Vegaでは入力データに対して、それを可視化表現に変換するための定義をJSONによって記述します。以下では、折れ線グラフと棒グラフを一つのグラフ上に重ねて表示するフローをVegaノードによる可視化の例として紹介します。以下は、そのNode-REDフローです。

![vega-flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546217/2ab2978c-ca0f-d2c7-f9c0-761a3f2c1edb.png)

このフローでは、指定したデータをJSONオブジェクトに変換できる`template`ノードを用いてVegaの可視化仕様を定義しています。また、可視化対象のデータも同様に`template`ノードで定義し後で合成しています。このように可視化定義とデータを分けることで、可視化定義の再利用性を高めることができます。

具体的には、2つ目のノードでJSONによる可視化定義を行い、3つ目のノードで可視化定義中に可視化対象のデータを埋め込んでいます。データは、以下の形式のオブジェクトを要素とする配列です。

```JSON
{
    "year": <<年>>,
    "population": <<人口>>,
    "GDP": <<GDP>>
}
```
データを埋め込んだ可視化定義をVegaノードに入力するとダッシュボードにグラフが表示されます。

それでは、Vegaによる可視化定義を順に見ていきましょう。


```JSON
{
    "width": "360",
    "height": "250",
    "data": {
        "values": []
    },
```
まずは、表示領域の大きさを`width`, `height`で定義します。`values`は3つ目のノードで設定するデータ配列です。

```JSON    
    "layer": [
        {
            "mark": "line",
            "encoding": {
                "x": {
                    "field": "year",
                    "type": "temporal"
                },
                "y": {
                    "field": "population",
                    "type": "quantitative",
                    "scale": {
                        "zero": false
                    }
                }
            }
        },
```

`layer`で複数のグラフ(棒グラフと折れ線グラフ)を重ねます。
グラフの種別は`mark`で指定します。ここでは、折れ線グラフ(`line`)を指定しています。`encoding`の`x`及び`y`はグラフの縦軸および横軸の定義です。対応するデータ配列要素のフィールド名(`year`/`population`)、軸の種類(`temporal`(時間), `quantitative`(数量))を指定します。これだけの定義で折れ線グラフの表示を指示することができます。

続いて棒グラフの定義です。 

```JSON        
        {
            "mark": "bar",
            "encoding": {
                "x": {
                    "field": "year",
                    "type": "temporal"
                },
                "y": {
                    "field": "GDP",
                    "type": "quantitative"
                },
                "color": {
                    "value": "#080"
                },
                "fillOpacity": {
                    "value": 0.5
                }
            }
        }
```

棒グラフの種別として`mark`に`bar`を指定します。`encoding`の`x`および`y`は折れ線グラフと同じです。棒グラフでは、棒の色と透明度を`color`および`fillOpacity`で指定しています。

```JSON
    ],
    "resolve": {
        "scale": {
            "y": "independent"
        }
    }
}
```

最後に折れ線グラフと棒グラフの縦軸が独立したものであることを定義します。結果は以下のグラフになります。

![vega-graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546217/5aa656cc-f54b-40d3-7ba2-3df039fca090.png)

# おわりに

この記事では、Node-REDダッシュボードでデータ可視化を行うUI部品であるVegaノードを紹介しました。

Vega/Vega-Lite構文は独特で最初はとっつきにくいと思いますが、Node-REDと組み合わせてうまく活用すれば高度なデータ可視化を行うプログラムを簡単に作成することが可能となります。ぜひ試してみてください。