【可視化】Bokeh・plotlyを使ってみた！【備忘録】

## 初めに

- 今回はBokehとplotlyについて触ってみたので、備忘録も兼ねて記事に残しておきたいと思います。
- 本記事は色々な記事を参考にして自身の備忘録を兼ねて作っておりますので、その点はご了承ください。
- なお、本記事はあくまで私の理解したところの範囲内で記載しており、内容の正確性は保証いたしかねますので、その点も併せてご了承ください(間違えがあれば教えてください、宜しくです)。

## 1. Bokehとは？

"そもそも、_`ボケ(英：bokeh)`_とはレンズの焦点の範囲外に生み出されるぼやけた領域の美しさ、及びそれを意図的に利用する表現手法（[from Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%B1_(%E5%86%99%E7%9C%9F))）"
だそうです(なんのこっちゃ?)。

さて、話はpythonで使える`可視化`ライブラリに話を戻したいと思います。
普段は_`matplotlib・seaborn`_あたりを使ってますが、もう少し動的な（_≒interactive_な）表現できるものがないかなと思い行きついたものです。
なお、以下で表示しているグラフは全て画像なので，動かせません．注意してください。

- [公式HP](https://docs.bokeh.org/en/latest/index.html)

### 1.1 インストール
公式HPによるとインストールについては`conda`、`pip`どちらでも行けるようです。

_`conda install bokeh`_
or
_`pip install bokeh`_

### 1.2 コーディング
それでは、やっていきたいと思います。基本的には公式HPのUser Guideに掲載されていることです。

- [公式User Guide](https://docs.bokeh.org/en/latest/docs/user_guide.html#userguide)

#### 1.2.1：ライブラリのインポート

```python
from bokeh.plotting import figure, output_file, show
```
おまじないのようなものです。覚えていて損はないです。

それでは、次からグラフを作っていきます。

#### 1.2.2：散布図(_scatter Markers_)
まずはコードの全体像です。以下のような感じです。

```python
from bokeh.plotting import figure, output_file, show

#1
output_file('scatter.html') 
p = figure(plot_width=400, plot_height=400)

#2
p.circle([1,2,3,4,5], [6,7,2,4,5], size=20, color='navy', alpha=0.5)

#3
show(p)
```
すると、以下のようなグラフが表示されると思います。
![scatterByBokeh (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395696/4b6152d6-0c23-c704-4f07-8b277c032bfa.png)


それでは一個ずつ見ていきます。

**#1: htmlファイルの作成 & figureの設定**
bokehでの出力はjpegやpngではなく、htmlでするようです。なので、これも呪文のように

_`output_file('xxx.html')`_

として、htmlを作成を作成するものと（少なくとも私は）割り切って覚えてます。
次の_`p = figure(plot_width=400, plot_height=400)`_ですが、これは**図を描画するスペースそ作る操作**、と理解してます。これはmatplotlibだと_`fig = plt.figure(...)`_みたいなものだと理解してます。


**#2: 散布図の中身（今回は円）をpに追加**
次の_`p.circle(・・・)`_ですが、これは上で作った**「_p_」**というスペースにその中身を追加する、というイメージで理解してます。今回は〇でプロットしようとしましたので_`.circle`_を使用しています*。

()の中身は、左から「x軸」・「y軸」・「表示方法」となっています。 

**#3: 描画**
図を描画する時は_`show(p)`_で表示できます（matplotlibでいう_`plt.show()`_ですね）。


これでbokehの基本が押さえられたと思います。

*bokehで散布図を作成する際のマーカーは様々あり、User Guideにもたくさん載っているので試してみると面白いと思います。

### 1.2.3 線グラフ(_Line Graph_)
次に線グラフを作ってみましょう（やり方はほとんど同じです）。

```python
from bokeh.plotting import figure, output_file, show

output_file('line.html')
p = figure(plot_width=400, plot_height=400)

p.line([1,2,3,4,5], [6,7,2,4,5], line_width=2)

show(p)
```
中身はほ散布図の時とほとんど一緒ですね。違うのは_`p.line(...)`_の「表示方法」の部分だけで、ここでは線の太さ(_line_width_)を指定してます。表示すると以下のような感じになると思います。

![2020-05-25 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395696/5ac55226-9538-9161-a7f2-003d25496ce1.png)

本記事ではbokehの初歩的な書き方をご紹介しましたが、皆様にはぜひマウスで動かしてヌルヌル動く図を体感いただければと思います。個人的には動的なプレゼンテーションには有用かなと思いました（pptの資料を作るのであればmatplotlib, seabornで十分かと思います）。

## 2. plotlyとは？
plotly社が提供している可視化ライブラリで、無料のものと一部有料のものがあるようです。詳細は以下公式HPをご覧ください。

- [公式HP](https://plotly.com/)

### 2.1 インストール
それではplotlyをインストールしてみましょう。bokeh同様にpip若しくはcondaでできます。

_`pip install plotly`_
_`conda install -c plotly plotly=4.7.1`_
(from 公式Document)

それではやっていきましょう！と思いきや、_jupyter notebook_で実行するにはもう一工夫必要とのことです。公式HPによると_jupyter notebook_でplotlyを使用するためには、

_`conda install "notebook>=5.3" "ipywidgets>=7.2"`_

をやっておく必要があるとのことです。なお、_`jupyter lab`_の場合は

_`conda install jupyterlab "ipywidgets=7.5"`_

をやっておく必要があるとのことです。

### 2.2:コーディング
#### 2.2.1: ライブラリのインポート
```python
import plotly.express as px
```

まずはplotly.expressというライブラリを使ってみます。

### 2.2.3: 散布図
コードの全体像は以下の通りです。

```python
import plotly.express as px

x = [1,2,3,4,5]
y = [6,7,2,4,5]

fig = px.scatter(x=x, y=y)
fig.show()
```
これを実行すると、
![newplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395696/3e090e70-5d08-5a53-9088-5500ec717a41.png)


このような図が表示されます。
(公式とは異なり、bokehで使ったものと同じでデータにしてあります。)
使い方は解説するまでもなく、非常にシンプルですね(matplotlibと同じような感じだな、と思いました)。

MatplotlibやBokehと異なる点として、軸名(_label_)を指定していないのに軸名が記載されている点ですかね。

上記では特段表示方法の指定をしませんでしたので、次はpandas.DataFrameと組み合わせて、各種設定も併せてやってみたいと思います。

```python
df = px.data.iris() # irisのデータをdata frameとして設定

fig = px.scatter(df, x=df.sepal_length, y=df.sepal_width,
                 color=df.species, size=df.petal_length)

fig.show()
```
すると以下のようなグラフが出力されると思います。
![iris_plotting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395696/3211e330-0a94-dfea-32c3-e5c4f0b3c5fb.png)

figの中に_`px.sctter(...)`_を放り込んで、()の中で各種設定をしています。

| 1 | 2 | 3 |
|---|---|---|
| dataframe |データを読み込む  | df |
| x= |x軸の設定(データ + 軸名の設定) |df.sepal_length|
| y= |y軸の設定(データ + 軸名の設定) |df.sepal_width|
| color= |色の設定(設定した列の内容が反映される) |df.species|
| size= | 円のサイズ設定(設定した列の内容が反映される) |df.petal_length|
 
まず_Iris_のデータをちらっと見ておきましょう。

```python
df.head()
```
| |sepal_length | sepal_width|petal_length|petal_width|species|species_id|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|0|5.1|3.5|1.4|	0.2|setosa|1
|1|4.9|3.0|1.4|	0.2|setosa|1
|2|4.7|3.2|1.3|	0.2|setosa|1
|3|4.6|3.1|1.5| 0.2|setosa|1
|4|5.0|3.6|1.4| 0.2|setosa|1

- df: データフレームの読み込みをしてます。  
- x= , y=:`x軸`、`y軸`を設定してます。ここでの注目点は中のデータを指定するとともに、軸名もcolumn名でとってきている点です。
- color=：ここでは`species`を用いて分類してます。
- size=: 円の大きさを設定してます。ここでは`petal_length`を使って円の大きさを表現してます。

plotlyで面白いのはグラフにマウスカーソルでデータを触れるとそのデータに何が含まれるのかを表示してくれる点かと思います。今回は扱いませんが3次元データとかは視覚的にも非常にわかりやすいです。

matplotlibやbokehとはまた違った動作なので慣れるには使い倒すしかありませんが非常に面白いです。

## 最後に
- 今回は2つの可視化ライブラリを触ってみました
- bokeh, plotlyのどちらもmatplotlibと異なり動的な表現が可能なので、面白いですし用途も広がると思います（どのライブラリにも長所があると思います）。
- 個人的にはplotlyの理解をこれから深めていきたいと思います（ある程度習熟すれば強力な武器になるかなと...）。



以上。