1. inoory

    Posted

    inoory
Changes in title
+[Python] Plotlyでぐりぐり動かせるグラフを作る
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,140 @@
+#はじめに
+Pythonから利用できるライブラリ、[Plotly](https://plot.ly/python/)の初歩的な使い方を記述します。
+[リンク先](https://plot.ly/python/)のサンプルを見るとわかるように、Plotlyを用いると、非常に多くの種類の、**ぐりぐり動かせる**グラフを作ることができます。
+
+なお、Plotlyには、作成したグラフをWeb上で編集したり、公開したりできる機能がありますが、
+今回は**すべてローカルで実行**することとします。
+
+# 実行環境
+* Windows 10
+* Python 3.5.2(Anaconda)
+* Jupyter notebook
+
+#インストール
+```pip install plotly```でPlotlyをインストールします。
+
+#データの取り込み
+例として、[Wikipedia](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E4%BA%BA%E5%8F%A3%E7%B5%B1%E8%A8%88)から拾ってきた、日本の年ごとの出生数と出生率のデータをグラフ化してみます。
+下記データを`birth.csv`としたものを、Jupyterのファイルと同一フォルダに置きます。
+
+```
+year,bitrhs,birth rate
+2000,1190547,1.36
+2001,1170662,1.33
+2002,1153855,1.32
+2003,1123610,1.29
+2004,1110721,1.29
+2005,1062530,1.26
+2006,1092674,1.32
+2007,1089818,1.34
+2008,1091156,1.37
+2009,1070035,1.37
+2010,1071304,1.39
+2011,1050806,1.39
+2012,1037101,1.41
+2013,1029816,1.43
+2014,1003532,1.42
+2015,1005656,1.46
+```
+
+データの取り込みや操作には、Pandasを用いると便利です。
+Pandasは、Anacondaをインストールすると自動的に入っています。
+
+```
+import pandas as pd
+raw = pd.read_csv("birth.csv")
+```
+
+#グラフの作成
+##初期化
+まず、Jupyter内部でプロットするために、下記コードを実行します。Jupyter内部で表示しない場合には不要です。
+引数にある、`connected`を`True`にすると、PlotlyのJavascriptをインターネットから取得するようになります。
+
+```
+import plotly
+plotly.offline.init_notebook_mode(connected=False)
+```
+
+##プロットするデータの指定
+続いて、プロットするデータを指定します。
+今回、出生数は棒グラフ、出生率は折れ線グラフで表現します。
+`data`という配列を用意し、棒グラフだったら`plotly.graph_objs.Bar`、
+折れ線グラフだったら`plotly.graph_objs.Scatter`に、X軸やY軸のデータ、系列名を指定します。
+`yaxis="y2"`と指定することで、第2軸にプロットすることができます。
+
+```
+data = [
+ plotly.graph_objs.Bar(x=raw["year"], y=raw["births"], name="Births"),
+ plotly.graph_objs.Scatter(x=raw["year"], y=raw["birth rate"], name="Birth Rate", yaxis="y2")
+]
+```
+
+##グラフレイアウトの指定
+次に、グラフのレイアウトを指定します。グラフのタイトルや、凡例の位置、第2軸を設定します。
+
+```
+layout = plotly.graph_objs.Layout(
+ title="Births and Birth Rate in Japan",
+ legend={"x":0.8, "y":0.1},
+ xaxis={"title":"Year"},
+ yaxis={"title":"Births"},
+ yaxis2={"title":"Birth Rate", "overlaying":'y', "side":'right'},
+)
+```
+
+##プロット
+Jupyter内で表示したい場合には、`iplot`を呼んで、グラフを作成します。
+Jupyter外部で表示する場合や、HTMLを作成したい場合には、`plot`を呼びます。オプションでファイル名を指定しない場合には、同一フォルダに```temp-plot.html```が作成されます。
+
+```
+fig = plotly.graph_objs.Figure(data=data, layout=layout)
+plotly.offline.iplot(fig)
+#plotly.offline.plot(fig)
+```
+こんな感じのグラフが出来上がります。(*画像なので動きません)
+![graph.png](https://qiita-image-store.s3.amazonaws.com/0/61468/bef8bd06-b17f-f90c-97ad-62f8c5c771cf.png)
+
+
+##グラフの操作
+作成したグラフを自在に動かせるというのがPlotlyを用いる最大の利点かなと思います。
+簡単な操作方法はこちら
+
+* グラフ内でドラッグすると、X軸方向、Y軸方向、矩形に拡大
+* X軸、Y軸上でドラッグすると、軸方向に移動
+* ダブルクリックすると、初期表示に戻る
+* ツールバーのボタンを押して画像として保存
+
+##その他オプション
+軸の最小最大値や目盛り、色、フォント、グラフの大きさなどなど、Plotlyでは細かい部分まで指定することができます。
+これらオプションについては、[Plotlyのサイト](https://plot.ly/python/#layout-options)を見たり、googleで検索してみましょう。
+
+# ツールバーの不要なボタンや「Edit in Plotly」の削除
+ローカル外に漏らしたくないデータの場合、作成したグラフに、「Save and edit plot in cloud」や「Ploduced with Plotly」のボタンや、「Export to plot.ly」のリンクが存在するのは、気持ちのいいものではないです。そこで、これらを表示させないようにします。
+
+![buttons.png](https://qiita-image-store.s3.amazonaws.com/0/61468/57da5cba-3088-4fe8-5178-b98ad85be7e9.png)
+
+
+まず、プロット時に`show_link=False`を指定することで、「Export to plot.ly」を消すことができます。
+
+```
+plotly.offline.iplot(fig, show_link=False)
+#plotly.offline.plot(fig, show_link=False)
+```
+
+一方、ツールバーのボタンの表示を消すオプションは、[StackOverflowの投稿](http://stackoverflow.com/questions/36554705/adding-config-modes-to-plotly-py-offline-modebar)や[関連するプルリクエスト](https://github.com/plotly/plotly.py/pull/410)がマージされていない状況を見る限り、存在しないようです。そこで、`init_notebook_mode`で読み込まれる、Plotlyのフォルダ内のplotly.min.jsを編集する方法をとります。
+
+```
+import plotly
+plotly_js_path = plotly.offline.__path__[0] + "\\plotly.min.js"
+with open(plotly_js_path, "r") as f:
+ plotly_js = f.read()
+ plotly_js = plotly_js.replace('displaylogo:!0', 'displaylogo:!1')
+ plotly_js = plotly_js.replace('modeBarButtonsToRemove:[]', 'modeBarButtonsToRemove:["sendDataToCloud"]')
+with open(plotly_js_path, "w") as f:
+ f.write(plotly_js)
+```
+
+このコードを実行後、
+1. Jupyterのメニューから「Kernel」->「Restart and Clear Output」を実行して保存
+2. Jupyterのウィンドウを閉じて、開きなおす
+を行った後、再度`iplot`や`plot`を実行すると、不要なボタンが消えていると思います。