Pythonでのプロットと可視化(pandas編) 〜 pandas.DataFrameのplot
前回「Pythonでのプロットと可視化(pandas編) 〜 pandas.Seriesのplot」の続き。
今度はpandas.DataFrame形式のデータをplotする。
さて、本題に入る前に、pandas.Seriesとpandas.DataFrameの違いを把握しておく。
次のコードを実行して、pandas.Seriesとpandas.DataFrameのデータを作成して中身を見てみる。
#coding:utf-8 import numpy as np import matplotlib.pyplot as plt import pandas as pd # 1.配列データの準備 dataNdArray = np.random.randn(1000).cumsum() # 2.Series形式およびDataFrameへ変換 s = pd.Series(dataNdArray) df = pd.DataFrame(dataNdArray)
pandas.Seriesとpandas.DataFrameは、それぞれ次のようなデータとなっている。
◎pandas.Series
0 0.761842
1 -0.918852
2 -0.595298
3 -1.158531
4 -0.727004
5 -2.763503
・・・・・◎pandas.DataFrame
0
0 0.761842
1 -0.918852
2 -0.595298
3 -1.158531
4 -0.727004
5 -2.763503
・・・・・
pandas.DataFrameのカラムを指定したdf[0]のデータは、pandas.Seriesとなる。今回の場合、これは「s = pd.Series(dataNdArray)」と同じデータ。
他にも沢山違いはあるが、これらはまた別の機会に行おう。
さて可視化。
◎折れ線
まずは単純なplot。
#coding:utf-8 import numpy as np import matplotlib.pyplot as plt import pandas as pd # 1.配列データの準備 dataNdArray = np.random.randn(1000).cumsum() # 2.Series形式およびDataFrameへ変換 df = pd.DataFrame(dataNdArray) # 3.可視化 df.plot()
次に、複数サブプロットを用意してそのうちの1つにグラフを描く。
#coding:utf-8 import numpy as np import matplotlib.pyplot as plt import pandas as pd # 1.配列データの準備 dataNdArray = np.random.randn(1000).cumsum() # 2.Series形式およびDataFrameへ変換 df = pd.DataFrame(dataNdArray) # 3.可視化 df.plot() # 3.可視化 # 3-1-1.サブプロットの準備1(複数のサブプロットを一度に作成) fig, axes = plt.subplots(2,1) # 3-2-1.作成したサブプロットをplot関数の引数に指定して可視化実行 df.plot( ax = axes[0], label='random walk', style='k', alpha=1, kind='line', use_index=True, grid=True ) axes[0].legend(loc='best')
結果は次図。
理由は分からないが、「label='random walk'」で指定したラベルが描かれない。。。
凡例を描くかどうかは、plot関数のオプションlegendで指定できる。デフォルトはTrueとなっている。
なので、「axes[0].legend(loc='best')」は意味をなさないのだろう。
※)一旦放置して進める。
さて、これまではpandas.DataFrameのデータが1つだったが、pandas.DataFrameはテーブル構造のデータを持つことができる。そのようなデータの可視化を試してみる。
まずはデータの準備だが、ランダムウォークのデータを4列準備する。
それには、次のコードを実行すれば良い。cumsum()の引数に0を指定しないと、全てのデータの累積和を求めてしまうので0を指定して各列毎に累積和を求める。
#coding:utf-8 import numpy as np import matplotlib.pyplot as plt import pandas as pd np.random.randn(1000,4).cumsum(0)
データを取得したら、1次元の場合と同様に可視化するだけで良い。
#coding:utf-8 import numpy as np import matplotlib.pyplot as plt import pandas as pd # 1.配列データの準備 dataNdArray = np.random.randn(1000,4).cumsum(0) # 2.Series形式およびDataFrameへ変換 df = pd.DataFrame(dataNdArray) # 3.可視化 # 3-1-1.サブプロットの準備1(複数のサブプロットを一度に作成) fig, axes = plt.subplots(2,1) # 3-2-1.作成したサブプロットをplot関数の引数に指定して可視化実行 df.plot( ax = axes[0], label='random walk', style='k', alpha=1, kind='line', use_index=True, grid=True )
ところで、グラフの凡例が数字(データフレームのカラム名)となっている。
これに名前を付けたい。それには、「columns=['Open','High','Low','Close']」などとして、データフレーム作成時にカラム名を与える。
※)この時点で、作成するランダムウォークの列数とデータフレームへのデータ変換時のコードに依存関係が出来てしまうのが嫌だが仕方がないのだろうか。
#coding:utf-8 import numpy as np import matplotlib.pyplot as plt import pandas as pd # 1.配列データの準備 dataNdArray = np.random.randn(1000,4).cumsum(0) # 2.Series形式およびDataFrameへ変換 df = pd.DataFrame( dataNdArray, columns=['Open','High','Low','Close'] ) # 3.可視化 # 3-1-1.サブプロットの準備1(複数のサブプロットを一度に作成) fig, axes = plt.subplots(2,1) # 3-2-1.作成したサブプロットをplot関数の引数に指定して可視化実行 df.plot( ax = axes[0], label='random walk', style='k', alpha=1, kind='line', use_index=True, grid=True )
結果は次図だが、相変わらず凡例がおかしな位置に出来てしまう。
以上。
Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney,小林儀匡,鈴木宏尚,瀬戸山雅人,滝口開資,野上大介
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/12/26
- メディア: 大型本
- この商品を含むブログ (19件) を見る