「plotly.js」で時系列折れ線グラフを作成してみる


plotly.jsを使用する機会があったので時系列折れ線グラフ作成までの手順を紹介します。
## plotly.jsとは
Plotly.jsは、データ可視化のための強力なJavaScriptライブラリであり、Webベースのインタラクティブなグラフやチャートを作成するために利用されます。このライブラリは、豊富な機能を提供し、多様なグラフやカスタマイズオプションを備えています。Plotly.jsを用いることで、データを効果的に表現し、ユーザーがグラフを探索したり分析したりすることが可能となります。

公式：[plotly.jsの公式ドキュメント](https://plotly.com/javascript/)

## インストール
```bash:bash
npm install react-plotly.js plotly.js　plotly.js-basic-dist
```
or
```bash:bash
yarn add react-plotly.js plotly.js　plotly.js-basic-dist
```

## グラフの作成
グラフはインストールしたPlotlyコンポーネントにdataを渡すだけで作成できます！
```react: plotly.tsx
import Plotly from "plotly.js-basic-dist";
import createPlotlyComponent from "react-plotly.js/factory";

const Plot = createPlotlyComponent(Plotly);

const MyPlot = (): JSX.Element => {
    const trace1 = {
        x: [1, 2, 3, 4],
        y: [10, 15, 13, 17],
        //　今回は折れ線グラフを作成できる"lenes"を指定します
        type: "lines",
    };

    const data = [trace1] as Plotly.Data[];
    const layout = {
        width: 800,
        height: 400,
    } as Plotly.Layout;

    return (
        <Plot
            data={data}
            layout={layout}
        >
    )
};
```
![スクリーンショット 2023-12-05 15.51.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618598/33ce2b5f-5b4e-56e1-32d5-0710aed43e27.png)


#### データの複数表示
```react: plotly.tsx
import Plotly from "plotly.js-basic-dist";
import createPlotlyComponent from "react-plotly.js/factory";

const Plot = createPlotlyComponent(Plotly);

const MyPlot = (): JSX.Element => {
    const trace1 = {
        x: [1, 2, 3, 4],
        y: [10, 15, 13, 17],
        type: "lines",
    };

    const trace2 = {
        x: [4, 3, 2, 1],
        y: [12, 14, 17, 11],
        type: "lines",
    };

    // データを複数用意し、配列で渡す
    const data = [trace1, trace2] as Plotly.Data[];
    const layout = {
        width: 800,
        height: 400,
    } as Plotly.Layout;

    return (
        <Plot
            data={data}
            layout={layout}
        >
    )
};
```

![スクリーンショット 2023-12-05 16.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618598/076fbf63-e8f4-75aa-578c-c4e5fb9c38fe.png)


## レイアウトの調整
plotlyで用意されているプロパティでレイアウトを調整していきます。

```js
// まずはデータを整える
const mens = {
    //時系列風にするためにx軸の値に日付を指定
    x: ["2023/1", "2023/2", "2023/3", "2023/4"],
    y: [10, 15, 13, 17],
    name: "男",
    type: "lines",
};

const women = {
    x: ["2023/1", "2023/3", "2023/5", "2023/7"],
    y: [12, 14, 17, 11],
    name: "女",
    type: "lines",
};

const data = [mens, women] as Plotly.Data[];
```
![スクリーンショット 2023-12-05 16.29.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618598/3b3fab28-2c29-4c9b-cc2c-ee9912383d6b.png)

### 凡例の位置を変更
凡例を水平方向に表示したいためlegendプロパティのorientationプロパティに"h"を指定。
デフォルトで"v"が指定されています。
「vertical」の「v」と「horizontal」の「h」かな？？
```js
const layout = {
    // ...省略
    legend: {
        orientation: "h",
    },
}
```

![スクリーンショット 2023-12-05 16.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618598/3e0763a9-ca7e-b7e2-54b8-43cfb6956b70.png)

### マーカーのカスタマイズ（折れ線）
マーカーのポイントはクリックが可能なのでクリックしやすいように大きさ等を設定していきます。

```js
const men = {
    // ...省略
    marker: {
        // 線の色
        color: "bleu",
        line: {
            // 枠線の色
            color: "#fff",
            // 線の太さ
            width: 1,
        },
        // ポイントの大きさ
        size: 14,
    },
}

const women = {
    // ...省略
    marker: {
        color: "red",
        line: {
            color: "#fff",
            width: 1,
        },
        size: 14,
    },
}
```
![スクリーンショット 2023-12-05 17.02.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618598/02269ce1-2754-99f0-a77f-ebe936cd29f0.png)

### y軸の固定
渡すデータによって初期表示のズーム比率が変わるため（今回の場合は最低値の10と最大値の17の範囲）y軸の表示を0から20の範囲で固定します。

```js
const layout = {
    // ...省略
    yaxis: {
        range: [0, 20],
    },
}
```

![スクリーンショット 2023-12-05 17.45.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618598/950e4cf8-dd22-8d78-b4dd-a55c9e3c7c4d.png)

### モートバーのカスタマイズ
最後にモートバーの不要な機能を削除して・・・・
```react
{
    // ...省略
    const config = {
        // モートバーを常に表示する
        displayModeBar: true,
        // plotlyのロゴを削除
        displaylogo: false,
        // 必要な機能のみ下記に追加する
        modeBarButtons: [
            // 配列を分けることでアイコン同士の間隔をあけることができます
            ["zoom2d", "pan2d"],
            ["zoomIn2d", "zoomOut2d", "autoScale2d", "resetViews"],
        ],
    } as Plotly.Config;
    
    return (
            // コンポーネントにconfigを渡す
        <Plot config={config} data={data} layout={layout} />
    );
};
```

## 完成
![スクリーンショット 2023-12-05 18.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618598/9dd27854-767b-f190-3bd9-3c61f585bbb0.png)


シンプルで見やすいグラフができたと思います！（多分(-_-;)）

最終的なコード
```react: plotly.tsx
import Plotly from "plotly.js-basic-dist";
import createPlotlyComponent from "react-plotly.js/factory";

const Plot = createPlotlyComponent(Plotly);

const MyPlot = (): JSX.Element => {
    const mens = {
        x: ["2023/1", "2023/2", "2023/3", "2023/4"],
        y: [10, 15, 13, 17],
        name: "男",
        type: "lines",
        marker: {
            color: "blue",
            line: {
                color: "#fff",
                width: 1,
            },
            size: 14,
        },
        hovertemplate: "%{x}   %{y}",
    };

    const women = {
        x: ["2023/1", "2023/3", "2023/5", "2023/7"],
        y: [12, 14, 17, 11],
        name: "女",
        type: "lines",
        marker: {
            color: "red",
            line: {
                color: "#fff",
                width: 1,
            },
            size: 14,
        },
    };

    const data = [mens, women] as Plotly.Data[];
    
    const layout = {
        width: 900,
        height: 400,
        legend: {
            orientation: "h",
        },
        yaxis: {
            range: [0, 20],
        },
    } as Plotly.Layout;

    const config = {
        displayModeBar: true,
        displaylogo: false,
        modeBarButtons: [
            ["zoom2d", "pan2d"],
            ["zoomIn2d", "zoomOut2d", "autoScale2d", "resetViews"],
        ],
    } as Plotly.Config;

    return (
        <Plot config={config} data={data} layout={layout} />
    );
};
```

## 最後に
plotly.jsを使用して時系列折れ線グラフを作成してみました。
今回は時系列の折れ線グラフに焦点を当てて紹介しましたが、まだまだ紹介できてないレイアウトの設定や３Dグラフなどさまざまな種類のグラフを作成できるので、ぜひ色々カスタマイズして遊んでみてください！！

## PR
HRBrainでは一緒に働く仲間を募集しています！
Advent Calendarを見ていただき、興味を持っていただいた方はぜひ弊社の採用ページをご確認ください！

https://www.hrbrain.co.jp/recruit