matplotlib (+ pandas) によるデータ可視化の方法 (3)

[前々回](http://qiita.com/ynakayama/items/8d3b1f7356da5bcbe9bc)、[前回](http://qiita.com/ynakayama/items/aec4e962d738d24641ee)に引き続いて [matplotlib](http://matplotlib.org/) によるデータ可視化に焦点を当てていきます。今回から [pandas](http://pandas.pydata.org/) との組み合わせによる合わせ技となります。


## 折れ線グラフ

シリーズやデータフレームのオブジェクトをプロットすると、デフォルトでは折れ線グラフとなります。

```py3
import numpy as np
from pandas import *
from pylab import *
import matplotlib.pyplot as plt
from numpy.random import randn

# シリーズの単純なプロッティング
s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()

plt.show()
plt.savefig("image.png")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/e8a94114-b11a-7ab5-e1fc-033e928e6fa1.png)

```py3
# データフレームの単純なプロッティング
df = DataFrame(np.random.randn(10, 4).cumsum(0),
               columns=['A','B','C','D'],
               index=np.arange(0, 100, 10))
df.plot()
plt.show()
plt.savefig("image2.png")
```

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/70b8bf68-f09c-0f5f-1827-64866e021c0a.png)

pandas のプロット用のメソッドの大半にはオプションで ax パラメーターに matplotlib のサブプロットオブジェクトを指定できます。

plot に指定できるオプションの一覧としては以下の公式ドキュメントを参照するのが良いでしょう。

pandas.DataFrame.plot
http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.DataFrame.plot.html

## 棒グラフ

とくによく利用するのは kind でこれは線種を指定できます。 kind = 'bar' とすると棒グラフになります。

```py3
# シリーズを可視化する
data = Series(np.random.randn(16), index=list('abcdefghijklmnop'))
# 縦の棒グラフ
data.plot(kind='bar', ax=axes[0], color='k', alpha=0.7)
# 横の棒グラフ
data.plot(kind='barh', ax=axes[1], color='r', alpha=0.6)

plt.show()
plt.savefig("image3.png")
```

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/38501/cc54ce6d-8a3b-b035-b1cf-81ab3cd91f75.png)

データフレームを棒グラフにした場合、各行の値はグループとしてまとめられます。

```py3
# データフレームを可視化する
df = DataFrame(np.random.randn(6, 4),
               index=['1','2','3','4','5','6'],
               columns=Index(['A','B','C','D'], name='Genus'))

print( df )
# =>
# Genus         A         B         C         D
# 1     -0.350817 -0.017378 -0.991230 -0.223608
# 2      0.478712 -0.472764  0.677484 -0.852312
# 3      1.402219  0.381440  0.370080  0.682125
# 4     -1.733590  0.296124 -0.014841  1.140705
# 5      0.373399  1.150718  1.341984  1.040759
# 6     -0.013301 -0.202793 -1.367493 -0.572954

df.plot()
plt.show()
plt.savefig("image4.png")

df.plot(kind='bar') # 棒グラフにする
plt.show(grid=False, alpha=0.8)
plt.savefig("image5.png")

df.plot(kind='barh', stacked=True, alpha=0.5) # 積み上げ棒グラフにする (stacked オプション)
plt.show()
plt.savefig("image6.png")


```

![image4.png](https://qiita-image-store.s3.amazonaws.com/0/38501/edcf28a4-2ee4-588c-c632-8ab25cdc2522.png)

![image5.png](https://qiita-image-store.s3.amazonaws.com/0/38501/fc2b2d52-ad9e-ec7f-ded7-b450f8cba865.png)

![image6.png](https://qiita-image-store.s3.amazonaws.com/0/38501/b51bab64-3f27-9586-7c1b-a6b8eed035a2.png)

## 金融データを可視化する

以前の[金融データの分析とその可視化の回](http://qiita.com/ynakayama/items/32b1ca2a108876f889cc
)で使った csv を利用し pandas + matplotlib でプロッティングしてみます。

```py3
df = read_csv('stock_px.csv') # CSV を読み込む

print( df.head(10) ) # データフレームの先頭
# =>
# [6 rows x 4 columns]
#             Unnamed: 0  AAPL   MSFT    XOM     SPX
# 0  2003-01-02 00:00:00  7.40  21.11  29.22  909.03
# 1  2003-01-03 00:00:00  7.45  21.14  29.24  908.59
# 2  2003-01-06 00:00:00  7.45  21.52  29.96  929.01
# 3  2003-01-07 00:00:00  7.43  21.93  28.95  922.93
# 4  2003-01-08 00:00:00  7.28  21.31  28.83  909.93
# 5  2003-01-09 00:00:00  7.34  21.93  29.44  927.57
# 6  2003-01-10 00:00:00  7.36  21.97  29.03  927.57
# 7  2003-01-13 00:00:00  7.32  22.16  28.91  926.26
# 8  2003-01-14 00:00:00  7.30  22.39  29.17  931.66
# 9  2003-01-15 00:00:00  7.22  22.11  28.77  918.22

df.plot()
plt.show()
plt.savefig("image7.png")
```

![image7.png](https://qiita-image-store.s3.amazonaws.com/0/38501/8d5bea6b-8045-b4a3-e6aa-11e3037f224d.png)

CSV のデータをいとも簡単に可視化することができました。