HoloViewsの基本的なグラフをワンライナーで

[前回](http://qiita.com/driller/items/53be86cea3c3201e7e0f) に続き、今回は基本的なグラフを紹介します。

# グラフの種類
グラフは基本的に `holoviews.element` モジュールに属しているクラスを用いて描画します。

http://holoviews.org/Reference_Manual/holoviews.element.html

`holoviews.elements_list` を参照することで一覧を確認する方法もあります。

```python
import holoviews as hv

print(hv.elements_list)
```
```
['Tabular', 'Curve', 'Annotation', 'Histogram', 'GridImage', 'Bounds', 'VectorField', 'Trisurface', 'HSV', 'Dataset', 'Area', 'Spikes', 'BoxWhisker', 'Spread', 'VLine', 'Spline', 'Chart', 'Surface', 'Element3D', 'Arrow', 'Polygons', 'Points', 'ErrorBars', 'QuadMesh', 'HeatMap', 'Ellipse', 'Box', 'Raster', 'Table', 'Text', 'Image', 'HLine', 'ItemTable', 'Element2D', 'Contours', 'Bars', 'Scatter', 'Element', 'Scatter3D', 'Path', 'BaseShape', 'RGB']
```

今回は基本的なグラフである `holoviews.element.chart` を紹介します。

# 事前準備
必要なモジュールのインポート、サンプルデータを用意します。
(この時点でワンライナーじゃないというツッコミは勘弁してください)

```python
import holoviews as hv
import numpy as np

hv.extension('bokeh')

np.random.seed(111)
x = np.linspace(-np.pi, np.pi, 100)
```

バックエンドはBokehで設定していますが、matplotlibでも動作します。plotlyでは一部描画されないグラフがあります。

# 折れ線グラフ

```python
hv.Curve((x, np.sin(x)))
```

![curve.png](https://qiita-image-store.s3.amazonaws.com/0/22023/a9cc0c87-eea7-3802-2ba1-00a0f18811d0.png)



# 面グラフ

```python
hv.Area((x, np.sin(x)))
```

![area.png](https://qiita-image-store.s3.amazonaws.com/0/22023/ed6f0ba6-1015-3227-065b-dae1ad4cc307.png)


# 散布図

```python
hv.Points(np.random.randn(100, 2))
```

または

```python
hv.Scatter(np.random.randn(100, 2))
```

![points.png](https://qiita-image-store.s3.amazonaws.com/0/22023/de8fdaf3-0369-c5f9-0cfb-82af9c06536e.png)

`Points` と `Scatter` の違いは確認中です。

# 棒グラフ

```python
hv.Bars((list('abc'), range(1, 4)))
```

![bars.png](https://qiita-image-store.s3.amazonaws.com/0/22023/33f7c24b-03e8-f1b1-f050-4197df4848ed.png)

# ヒストグラム
自動計算はしてくれないので、度数とビンのエッジはnumpyから算出しています。

```python
hv.Histogram(np.histogram(np.random.randn(1000)))
```

![histogram.png](https://qiita-image-store.s3.amazonaws.com/0/22023/95de562d-88ab-858e-de9d-9c413161d1ac.png)


散布図などのグラフから `hist`メソッドを呼ぶことでヒストグラムを追加できます。すごく簡単ですね。

```python
hv.Points(np.random.randn(100, 2)).hist()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22023/903ee356-dffc-fd3e-f007-2279b75bcf9d.png)

# 箱ひげ図

```python
hv.BoxWhisker(np.random.randn(1000))
```

![boxwhisker.png](https://qiita-image-store.s3.amazonaws.com/0/22023/2f3f1c8d-80d3-fba8-00a6-985ab4fe085b.png)


# エラーバー
単体では味気ないので折れ線グラフを追加しています。

```python
hv.ErrorBars([(i, np.sin(i), np.random.rand() / 10)
              for i in x]) * hv.Curve((x, np.sin(x)))
```

![errorbars.png](https://qiita-image-store.s3.amazonaws.com/0/22023/7aea2f99-2f4f-ef56-efbe-2a695691a52c.png)

# スプレッド
元のデータに幅を与えたグラフです。(うまく説明できていない気がするのでツッコミ歓迎)
ボリンジャーバンドを作るのによさそうです。

```python
hv.Spread((x, np.sin(x), np.random.rand(100)))
```

![spread.png](https://qiita-image-store.s3.amazonaws.com/0/22023/111aef0f-b5f9-8a54-19ca-4739f80495f7.png)

# スペクトラム

```python
hv.Spikes(np.random.randn(100))
```

![spikes.png](https://qiita-image-store.s3.amazonaws.com/0/22023/64e4aa28-5993-dd47-19f6-3ea0f5928bd4.png)

下記のように散布図を組み合わせることもできます。

```python
p = hv.Points((np.random.randn(100, 2)))
p << hv.Spikes(p['y']) << hv.Spikes(p['x'])
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22023/d707881a-4ac6-bf46-99e6-2ea1ee1c58a1.png)

# ベクトル場

```python
hv.VectorField((range(10), range(10), np.random.rand(10), np.random.rand(10)))
```

![vectorfield.png](https://qiita-image-store.s3.amazonaws.com/0/22023/96046576-d94b-bf93-ac4e-f8304761b0bc.png)

# TBD
追加情報があれば順次アップデートしていきます。
* 各引数の説明
* グラフの設定(書式、軸など)

優先して解説がほしい内容などがあればコメントいただければと思います。