Up

Matplotlib描画備忘録

 

Matplotlibの機能でよく利用するものを、リスト1のスクリプトに上げておいた。リスト1のスクリプトを実行すると、図1のグラフが描画される。

図1

 

図1のグラフの描画スクリプトは以下のようである。

 

リスト1 描画スクリプト

import numpy as np

import matplotlib.pyplot as plt

 

mux, muy = 50, 5

sgmx, sgmy = 10, 1

rho = 0.5

n = 1000

xy = np.random.multivariate_normal([mux, muy],

                                   [[sgmx**2, rho*sgmx*sgmy],

                                    [rho*sgmx*sgmy, sgmy**2]], n)

xy_t = xy.transpose()

X = xy_t[0]

Y = xy_t[1]

 

coeff = np.polyfit(X, Y, 1)

 

plt.figure(figsize = (7, 7))

plt.plot(X, Y, 'bo', markersize = 7, alpha = 0.5, label = '(X,Y)')

plt.xlabel('X', fontsize = 16)

plt.ylabel('Y', fontsize = 16)

plt.plot([0, 100], [coeff[0] * 0.0 + coeff[1], coeff[0] * 100.0 + coeff[1]],

         'g-', linewidth = 3, label ='Y = {0:.3f} * X + {1:.3f}'.format(coeff[0], coeff[1]))

 

tickX = np.arange(0, 101, 10)

tickY = np.arange(0, 10.1, 1)

plt.xticks(tickX, fontsize = 14)

plt.yticks(tickY, fontsize = 14)

plt.legend(loc = 2, fontsize = 14)

str_rho = '{}'.format(rho)

plt.title('Samples for $\\rho_{param}$ = ' + str_rho, fontsize = 16)

plt.show()

 

リスト1のスクリプトでは、まず次のコードで2変量正規分布からの1000個のサンプルを得ている。

mux, muy = 50, 5

sgmx, sgmy = 10, 1

rho = 0.5

n = 1000

xy = np.random.multivariate_normal([mux, muy],

                                   [[sgmx**2, rho*sgmx*sgmy],

                                    [rho*sgmx*sgmy, sgmy**2]], n)

 

相関係数がrho=0.5で、平均が(mux, muy) = (50, 5)、標準偏差が(sgmx, sgmy) = (10, 1)である。

生成された乱数は(n, 2)型行列の形式であるので、これの転置行列xy_tをとり(2, n)型行列の形式に変換した後、第1変数の値をXに、第2変数の値をYに設定している。コードは以下のようである。

xy_t = xy.transpose()

X = xy_t[0]

Y = xy_t[1]

Xを独立変数、Yを従属変数とする単回帰モデルの係数は、次のコードで求められる。

coeff = np.polyfit(X, Y, 1)

傾きはcoeff[0]に、y切片はcoeff[1]に返される。

グラフの画面のサイズ(単位インチ)は、次のコードで設定される。

plt.figure(figsize = (7, 7))

横座標をX、縦座標をYとする散布図を次のコードで描いている。

plt.plot(X, Y, 'bo', markersize = 7, alpha = 0.5, label = '(X,Y)')

マーカーの大きさと透明度を指定しているが、指定しなかったときはデフォルト値が用いられる。labelの値(文字列)は、legend()を実行すると表示される。

回帰直線は、次のコードで描いている。

plt.plot([0, 100], [coeff[0] * 0.0 + coeff[1], coeff[0] * 100.0 + coeff[1]],

         'g-', linewidth = 3, label ='Y = {0:.3f} * X + {1:.3f}'.format(coeff[0], coeff[1]))

座標軸の目盛りは、指定されないときはグラフに合わせて自動的に設定されるが、次のように明示的に設定することもできる。

tickX = np.arange(0, 101, 10)

tickY = np.arange(0, 10.1, 1)

plt.xticks(tickX, fontsize = 14)

plt.yticks(tickY, fontsize = 14)

この目盛りの設定は、グラフ描画処理の最後に行う。

グラフの上部にテキストを表示するときは、関数titleを用いる。

str_rho = '{}'.format(rho)

plt.title('Samples for $\\rho_{param}$ = ' + str_rho, fontsize = 16)

Matplotlibでは、文字列にTexを利用することができる。文字列にformat関数を適用するときは、Texにおける{ }formatにおける{ }が混在するとエラーになるので、上のコードのように分離する必要がある。

 

なお、保存ボタン(図2)をクリックして描画グラフはファイルに保存することができる。

図2

 

保存したファイルをWordに取り込むときは、一旦描画ソフト「ペイント」で開いて、コピー・貼り付けを行えばよい。

 

 

Up