めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

機械学習のためのPython/NumPy/pandasチュートリアル(パート3)

※パート2は、こちらです。

パート3では、グラフの描画を説明します。

簡単なグラフの描き方

pltとしてimportしてあるmatplotlib.pyplotを用いると、散布図や折れ線グラフはすぐに表示できます。

散布図については、対象データのx座標のリストとy座標のリストを用意して、plt.scatter()に渡します。「座標(x,y)のリスト」を渡すわけではないのでご注意ください。

In [1]: data_x = np.arange(15)

In [2]: data_y = data_x ** 2

In [3]: data_x
Out[3]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

In [4]: data_y
Out[4]: 
array([  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100, 121, 144,
       169, 196])

In [5]: plt.scatter(data_x,data_y)
Out[5]: <matplotlib.collections.PathCollection at 0x4ddd610>

グラフの見栄えについては、各種オプションを駆使して調整が可能です。

折れ線グラフについては、x座標のリストとy座標のリストをplt.plot()に渡します。次の例では、np.sin()にリスト(array)を渡しているので、data_yにも結果がリスト(array)として返っている点に注意してください。

In [6]: data_x = np.linspace(0,1,100)

In [7]: data_y = np.sin(2*np.pi*data_x)

In [8]: plt.plot(data_x,data_y)
Out[8]: [<matplotlib.lines.Line2D at 0x52e9610>]

その他に便利なのが(x,y)平面上の値を色で表現する「ヒートマップ」です。次のように、二次元のリストで値を表現したデータをplt.imshow()に渡します。

In [9]: data = [ [x**2+y**2 for x in range(5)] for y in range(5)]

In [10]: data
Out[10]: 
[[0, 1, 4, 9, 16],
 [1, 2, 5, 10, 17],
 [4, 5, 8, 13, 20],
 [9, 10, 13, 18, 25],
 [16, 17, 20, 25, 32]]

In [11]: plt.imshow(data,extent=(0,4,4,0),interpolation='nearest')
Out[11]: <matplotlib.image.AxesImage at 0x4efa590>

extentは、座標に振るメモリの範囲を左下を原点にして、(xmin,xmax,ymin,ymax)で指定します。ここでは、右上を原点にするように(0,4,4,0)という値にしています。

interpolationの指定をはずすと、なめらかに変化するように補間処理が行われます。

In [12]: plt.imshow(data,extent=(0,4,4,0))
Out[12]: <matplotlib.image.AxesImage at 0x4eef710>

1つのウィンドウに複数のグラフを表示する際は、subplotの機能を使います。ウィンドウを表すfigureオブジェクトを取得して、add_subplot()メソッドでウィンドウ内のグラフ描画領域を追加します。add_subplot(縦方向の数、横方向の数、場所)で位置を指定します。(場所は、左上を原点にして、はじめに下に進みます。)

In [52]: fig = plt.figure()

In [53]: subplot = fig.add_subplot(1,2,1)

In [54]: linex = np.linspace(0,1,100)

In [55]: subplot.plot(linex, sin(2*np.pi*linex))
Out[55]: [<matplotlib.lines.Line2D at 0x4e0e0d0>]

In [56]: subplot = fig.add_subplot(1,2,2)

In [57]: subplot.plot(linex, cos(2*np.pi*linex))
Out[57]: [<matplotlib.lines.Line2D at 0x5df18d0>]

In [58]: fig.show()

その他には、DataFrameオブジェクトは、自分自身のグラフを描く機能を持っています。

In [90]: df=DataFrame(np.random.randn(5,4)+3,columns=['A','B','C','D'])

In [91]: df
Out[91]: 
          A         B         C         D
0  4.252865  3.672608  0.698344  3.001572
1  1.934676  3.724904  2.537281  2.800158
2  2.415245  1.254247  4.158918  1.914211
3  2.866201  1.036816  3.497218  2.876337
4  2.814133  3.262919  3.196999  4.132647

In [92]: df.plot(kind='bar')
Out[92]: <matplotlib.axes._subplots.AxesSubplot at 0x5dc0850>