Pythonの可視化パッケージの使い分け

Pythonで可視化といえばMatplotlibだけど、APIがごちゃちゃしていて覚えにくいのが難点かな。BokehがAPIもうまく整理されていて一番使い勝手がいい気がするけど、まだまだ日本語の情報が少ないのが惜しいところ。
これからはWebにも対応できるBokehが伸びてくるんじゃないかと勝手に期待している。

## おすすめの使い分け方
- 簡単なデータを手早くプロットするなら
    - Matplotlib
- MATLABからPythonに乗り換えたなら
    - Matplotlib
- かっこよく人に見せたいなら
    - Bokeh
- 対話操作を入れたいなら
    - Bokeh
- グラフ上のデータ点の数値を確認したいなら
    - Bokeh
    - Plotly
- 3D形状をプロットするなら
    - Plotly
    - Mayavi
- 統計分析するなら
    - seaborn

## Matplotlib
### 良い点
- 簡単なデータをプロットするのは楽。
- プロットの機能が充実している（気がする）。
- 日本語の情報が他と比べると多い。
- pandasのDataFrame.plotメソッドなどから直接プロットできる。
    - [Visualization](http://pandas.pydata.org/pandas-docs/stable/visualization.html#)
    - [API Reference - Series - Plotting](http://pandas.pydata.org/pandas-docs/stable/api.html#plotting)
    - [API Reference - DataFrame - Plotting](http://pandas.pydata.org/pandas-docs/stable/api.html#api-dataframe-plotting)
- APIがMATLABに似ているので、MATLABから乗り換えるのは楽。
- 3Dプロットのスケールが軸ごとに自動設定される。

### 悪い点
- デフォルトでは日本語が表示できない。
- Notebook上では対話的にグラフを動かせない。（`%matplotlib inline`の代わりに`%matplotlib notebook`としておけば動かせるけど、Notebookを閉じてもう一度開くと動かせなくなっている。）
- 命令型のAPIとオブジェクト指向のAPIが混在していて、混乱することがある。
- 対話操作のレスポンスは良くない。
- 3Dプロットの手順は面倒で覚えにくい。
- 3Dプロットで3軸のスケールを揃えるのはかなり面倒なので3D形状を表示するのには適していない。

### プロットのサンプル
![output_1_1.png](https://qiita-image-store.s3.amazonaws.com/0/37701/bd5fe67c-c928-8f4c-a73e-a28fff2dd0f3.png)

## Bokeh
### 良い点
- Notebook上でもプロット後に対話的にグラフを動かせる。
- 対話的に動かせるグラフをHTML化して人に渡せる。
    - [Embedding Plots and Apps](http://bokeh.pydata.org/en/latest/docs/user_guide/embed.html)
- 対話操作のカスタマイズが容易
    - [Configuring Plot Tools](http://bokeh.pydata.org/en/latest/docs/user_guide/tools.html)
    - [Adding Widgets](http://bokeh.pydata.org/en/latest/docs/user_guide/interaction/widgets.html)
- Webサイトに埋め込める。
    - [Running a Bokeh Server](http://bokeh.pydata.org/en/latest/docs/user_guide/server.html)
- ストリーミングデータで動的にグラフを更新できる。
    - [Updating From Threads](http://bokeh.pydata.org/en/latest/docs/user_guide/server.html#updating-from-threads)
- WebGLを有効にすれば大量のデータをプロットしてもレスポンスよく動かせる。
    - [Speeding up with WebGL](http://bokeh.pydata.org/en/latest/docs/user_guide/webgl.html)
- ドキュメントが読みやすい。

### 悪い点
- 3Dプロットができない。
- 基本となるplottingモジュールのAPIは色分けを自分でやらないといけない。
- chartsモジュールのAPIは簡単なデータをプロットするにはまわりくどい。

### プロットのサンプル
<img width="629" alt="スクリーンショット 2017-01-28 17.55.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/e036191b-7056-31d4-e02c-fa61ea50db80.png">
動かせるサンプルはここ　[Gallery — Bokeh 0.12.4 documentation](http://bokeh.pydata.org/en/latest/docs/gallery.html)

## Plotly
### 良い点
- Notebook上でもプロット後に対話的にグラフを動かせる。
- 対話的に動かせるグラフをHTML化して人に渡せる。
- データ点の数値を表示する機能がデフォルトで有効になっている。
- 3Dプロットが2Dプロットと同じ手順でできる。
- 3Dプロットのレスポンスがいい。
- 3Dプロットのスケールが3軸とも同じなので3D形状を表示するのに適している。

他の機能もだいたいBokehに近い感じだけど、詳しく調べていない。

### 悪い点
- グラフのサイズを指定するのが面倒。
- 3Dプロットを軸ごとに違うスケールで表示する方法がわからない。
- 情報がかなり少ない。
- 一部の機能は有料（Streamingは有料らしい）
- ドキュメントが参照しづらい。
    - docstringの説明が短い。
    - サンプルコードのほとんどが有料版のAPIを使っている。
    - 公式ドキュメントで検索ができない。

### プロットのサンプル
<img width="576" alt="スクリーンショット 2017-02-02 23.44.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/856beffe-7565-277d-6f17-f996a87f417d.png">
動かせるサンプルはここ　[Python Graphing Library, Plotly](https://plot.ly/python/)

### 補足: サンプルコードを無償版で動かすには
`import plotly.plotly as py` を `import plotly.offline as py` に置き換えれば、だいたいは動くはず。

## Mayavi
### 良い点
- 3Dプロット専用なので3Dプロットの機能が充実している。
- プロット後に設定を変更できる。
- 3Dプロットについての日本語のチュートリアルがある。
    - [3.5. Mayavi による 3D プロット — Scipy lecture notes](http://www.turbare.net/transl/scipy-lecture-notes/packages/3d_plotting/index.html)

### 悪い点
- PyQt5に対応していないのでインストールが面倒
    - Anaconda 4.3.0のroot環境ではデフォルトでは動かない。
    - バージョンを指定してPyQt4をインストールする必要がある。
    - `conda update --all`はNG（PyQt5にアップデートされる）
- デフォルトでは軸が表示されない。
- Notebook上での表示は一応できるが、かなり機能が限られている。

## seaborn
### 良い点
- 統計分析に特化した超高水準のAPIがたくさんある
    - lmplot: 回帰とプロットをいっぺんに
        - [seaborn.lmplot](http://seaborn.pydata.org/generated/seaborn.lmplot.html)
    - jointplot: 2変数の散布図とヒストグラムの組み合わせ
        - [seaborn.jointplot](http://seaborn.pydata.org/generated/seaborn.jointplot.html)
    - pairplot: 多変数の散布図をまとめて
        - [seaborn.pairplot](http://seaborn.pydata.org/generated/seaborn.pairplot.html)
- jitterが便利（重複して見えにくい点を少しずらしてプロットする機能）
    - jitterの例: [seaborn.stripplot](http://seaborn.pydata.org/generated/seaborn.stripplot.html)

### 悪い点
- インポートするだけで勝手にMatplotlibのスタイルを変更してしまう。

## 参考リンク
[Jupyter-notebook の作図ライブラリ比較 - Qiita](http://qiita.com/deaikei/items/b71c1ca2c4c2a2c37526)
[なんでもかんでもJupyter Notebookに表示するためのチートシート - Qiita](http://qiita.com/alchemist/items/f528e77f195eb65a04df)