スプレッドシートでシートをコピペしてグラフを作る作業から逃れたかった話

## はじめに
みなさんは業務でグラフを作ることがありますか？
作るときどんなツールを使いますか？

おそらくスプレッドシートやExcelを使っているという方が多いのではと思います。
私も手軽に動的なグラフが作成できるので業務で時々使用していました。

## 今回の記事投稿のきっかけ
業務で定期的にデータを収集して、その結果をグラフ化することがあるのですが
毎時追加される大量のデータをグラフ化する際に、毎回データを貼り付けたりシートをコピーするのがめんどくさいなと思っていました。
Pythonのコードで自動化してJupyter NotebookやGoogle Colabで全てのセル実行するだけで毎回最新のグラフを作成できたらなぁ。。。と思っていたところPlotlyを使用したらできました。

## 結論
Jupyter Notebook上でデータを取得してPython&Plotlyで作成したコードのひな形をもとに様々な場面で活用されており、
無事スプレッドシートのシートコピペ作業から脱却できました。

ただし、スプレッドシートが全く使えないというわけではなく、
例えばある程度データの取得方法やグラフの形式などが似た動的なグラフを複数作成したい場合は
まずスプレッドシートで試験的に作成して、ある程度想定するグラフが作成できたら
その内容を基に自動的に出力できるようなコードを書き、細かい調整をするというようにスプレッドシートとコード（Python&Plotly）を組み合わせることでより良いグラフが作れると思います。

以下、サンプルデータをもとに作成したグラフの比較とそれぞれ作成してみた結果の比較の詳細です。

## できたグラフの比較
今回は比較用のサンプルデータとして気象庁の過去の気象データ・ダウンロードの[ページ](https://www.data.jma.go.jp/gmd/risk/obsdl/)から2022年の東京の平均気温と日照時間のcsvファイルをダウンロードしGoogle Driveにアップロードして使用しました。

スプレッドシートで作成したグラフ
![2022年の東京の平均気温と日照時間(時間)の関係.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423172/9eee576f-5901-7183-dd25-90323f892ee9.png)


Plotlyで作成したグラフ
![newplot (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423172/78c79952-e455-fd09-c84b-233f9b07836f.png)

画像だけでは分かりづらいですね。ただし、個人的にはPlotlyで作成したグラフの方が少しカッコいい感じがします。

## Plotlyに至るまで
グラフを生成するコードを書くとして、
普段Pythonを使っているのでPythonで書くとして、グラフといえばmatplotlibです。

ところが、ある問題が発生します。

matplotlibだとスプレッドシートで作成するようなグラフが作れない！

私がmatplotlibを使いこなせていないだけかもしれませんが、作成したグラフから特定の日付やデータの詳細を確認したい時に、目盛りを見てざっくりしか判断できず、使い勝手が悪いなと思っていました。

そこでPythonで動的なグラフが作れないか調べたところPlotlyというライブラリを見つけました。


### Plotlyとは
Python用のオープンソースグラフ作成ライブラリです。
折れ線グラフ、散布図、面グラフ、棒グラフ、エラー バー、箱ひげ図、ヒストグラム、ヒートマップ、サブプロット、複数軸、極グラフ、バブル チャートが作成できます。
Matplotlibは静的なグラフが作成できるのに対し、Plotlyでは動的なグラフが作成できます。
公式リンクは[こちら](https://plotly.com/python/)です。


### スプレッドシートで作成したグラフとplotlyで作るグラフの違い
それぞれ作ってみた結果、個人的に感じた違いは以下の通りです。

スプレッドシートで作成したグラフのメリット：

* グラフの基となるデータを手軽に加工できる
* 画面上で手軽にグラフのレイアウトを変えられる
* 特別な知識は特に必要ない
* 長時間経過してもデータとグラフを保持（スプレッドシート内で）することができる

Plotlyのメリット：

* 細かい調整（一枚に四つのグラフを表示することなど）ができる
* 様々なファイル形式で保存することができる
* コードさえ書ければ簡単にグラフが作成できる

スプレッドシートで作成したグラフのデメリット：

* 画像出力しかできない
* 細かい調整ができない
* 似たようなグラフを複数作る場合に手間がかかる

Plotlyのデメリット：

* 長時間データを保持して追加する場合には向かない
* データ加工に知識（Python、NumPy、Pandas、Plotlyなど）が必要


以下、表にまとめてみました。


<table>
  <caption>スプレッドシートで作成したグラフとplotlyで作るグラフのメリットとデメリット</caption>
  <thead>
    <tr>
      <th></th> <th>スプレッドシート</th> <th>Plotly</th>
    </tr>
  </thead>
  <tr>
    <td> メリット
     </td>
    <td> ・グラフの基となるデータを手軽に加工できる<br>
         ・画面上で手軽にグラフのレイアウトを変えられる<br>
         ・特別な知識は特に必要ない<br>
         ・長時間経過してもデータとグラフを保持(スプレッドシート内で)することができる
    </td>
    <td> ・細かい調整(一枚に四つのグラフを表示することなど)ができる<br>
         ・様々なファイル形式で保存することができる<br>
         ・コードさえ書くことができれば簡単にグラフが作成できる
    </td>
  </tr>
    <tr>
    <td> デメリット
     </td>
    <td> ・画像出力しかできない<br>
         ・細かい調整ができない<br>
         ・似たようなグラフを複数作る場合手間になる
    </td>
    <td> ・長時間データを保持して追加する場合には向かない<br>
         ・データ加工に知識(Python,numpy,pandas,plotlyなど)が必要
    </td>
  </tr>
</table>

スプレッドシートは手軽に動的なグラフが作成できる一方で、
一枚に四つのグラフを作成したい場合やメモリの細かな調整など細かい調整ができず、同じような取得方法で似た形式のグラフを一括で作成したい場合は手間になってしまうことがあります。
また、Plotlyを使用したコードの場合は
細かい調整や様々なファイル形式で出力・保存ができ、一括で複数のグラフを出力できる一方で、ある程度の知識がないとデータの加工やグラフの作成ができないので、作成に時間がかかるかもしれません。


## 最後に
この記事を作成している最中にQiitaだとhtml形式の動的なグラフが共有できないという致命的な問題に気づきました。
Plotlyの大きな魅力の一つである動的なグラフを出力してデータの詳細を確認できたりZoom InやOutができる楽しさを[GitHubで共有](https://github.com/yuuka51/google_colab/tree/e9b20b426cabaa75212590aabb64ed2dc61546db/create_graph_by_plotly)したいと思います。
htmlファイルをダウンロードして表示するとグラフの操作が色々できます。

また、公式ドキュメント内にもサンプルコードとサンプルのグラフがあるのでそちらも見ていただけると面白いと思いますし、htmlファイルをダウンロードしなくても表示できるので
とりあえずどんな動的なグラフができるのか見たい方にはおすすめです。
- Plotly 公式ドキュメント - 棒グラフサンプルコード: https://plotly.com/python/renderers/
- Plotly 公式ドキュメント - 折れ線グラフサンプルコード: https://plotly.com/python/line-charts/

この記事が日常的にグラフを作成している方の何らかの助けになることがあったら幸いです。

## 参考
https://plotly.com/python/