1. inoory

    No comment

    inoory
Changes in body
Source | HTML | Preview
@@ -1,167 +1,184 @@
#はじめに
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をインストールすると自動的に入っています。
```py3
import pandas as pd
raw = pd.read_csv("birth.csv")
```
#グラフの作成
##初期化
まず、Jupyter内部でプロットするために、下記コードを実行します。Jupyter内部で表示しない場合には不要です。
引数にある、`connected`を`True`にすると、PlotlyのJavascriptをインターネットから取得するようになります。
```py3
import plotly
plotly.offline.init_notebook_mode(connected=False)
```
##プロットするデータの指定
続いて、プロットするデータを指定します。
今回、出生数は棒グラフ、出生率は折れ線グラフで表現します。
`data`という配列を用意し、棒グラフだったら`plotly.graph_objs.Bar`、
折れ線グラフだったら`plotly.graph_objs.Scatter`に、X軸やY軸のデータ、系列名を指定します。
`yaxis="y2"`と指定することで、第2軸にプロットすることができます。
```py3
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軸を設定します。
```py3
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```が作成されます。
```py3
fig = plotly.graph_objs.Figure(data=data, layout=layout)
plotly.offline.iplot(fig)
#plotly.offline.plot(fig)
```
こんな感じのグラフが出来上がります。
![aa.gif](https://qiita-image-store.s3.amazonaws.com/0/61468/ba24fbbe-160b-6f0e-3ccb-5db295943cbf.gif)
簡単な操作方法はこちら
* グラフ内でドラッグすると、X軸方向、Y軸方向、矩形に拡大
* X軸、Y軸上でドラッグすると、軸方向に移動
* ダブルクリックすると、初期表示に戻る
* ツールバーのボタンを押して画像として保存
##その他オプション
###グラフエリアの大きさ
```py3
layout = plotly.graph_objs.Layout(
width=800, height=600,
)
```
###軸の最大値最小値
単に最大最小値を設定する場合は、`axis`に`range`オプションを指定します。
ゼロから目盛りを始めたい場合や、負数を表示したくない場合には、
`rangemode`オプションに`"tozero"`や`"nonnegative"`を指定します。
```py3
layout = plotly.graph_objs.Layout(
xaxis={"title":"Year", "range": [2010, 2016]}, #from year 2010 to 2016
yaxis={"title":"Births", "rangemode":"tozero"}, #starts from zero
)
```
###フォント
font-familyはCSSで指定するのと同じようにします。
```py3
layout = plotly.graph_objs.Layout(
font={"family":"Yu Gothic Bold, sans-selif", "size":20},
)
```
###そのほか
そのほか、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」を消すことができます。
```py3
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を編集する方法をとります。
```py3
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`を実行すると、不要なボタンが消えていると思います。
+
+# ひとまず折れ線グラフを描きたいときのコピペ用
+```py3
+import plotly
+plotly.offline.init_notebook_mode()
+data = [
+ plotly.graph_objs.Scatter(y=raw["bitrhs"], name="bitrhs"),
+]
+layout = plotly.graph_objs.Layout(
+ title="title",
+ legend={"x":0.8, "y":0.1},
+ xaxis={"title":""},
+ yaxis={"title":""},
+)
+fig = plotly.graph_objs.Figure(data=data, layout=layout)
+plotly.offline.iplot(fig, show_link=False)
+```