ここまでの例では plt.subplots()
関数の第1引数と第2引数にどちらも 1
を指定してグラフを描画してきましたが,これらの引数に行数,列数の値を指定すると複数のグラフをまとめて描画することができるようになります.ここでは散布図を複数個並べて描画して,相関係数のイメージを掴むことにします.
まず,必要なモジュールを読み込みます.
モジュールを読み込む
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 高解像度ディスプレイ用
from IPython.display import set_matplotlib_formats
# from matplotlib_inline.backend_inline import set_matplotlib_formats # バージョンによってはこちらを有効に
set_matplotlib_formats('retina')
次に,サンプルデータ (corrcoef-sample.csv) を GitHub のリポジトリから Pandas のデータフレームに読み込んで表示してみます.
サンプルデータのダウンロード
url = "https://github.com/rinsaka/sample-data-sets/blob/master/corrcoef-sample.csv?raw=true"
df = pd.read_csv(url)
df
上のデータにおいて,x
列は平均 5,標準偏差 2 の一様乱数です.その他の列は x
列との相関係数が -1.0 から +1.0 になるように生成したデータです.
次のようなコードで 3 行 3 列のグラフを描画することができるようになります.それと同時に相関係数と散布図の関係を読み取ることができるようになりました.
グラフの描画
# グラフ全体の大きさを指定
figsize = (9, 9)
# 行数と列数を指定
rows = 3
cols = 3
fig, ax = plt.subplots(
rows,
cols,
figsize=figsize,
sharex=True, sharey=True, # 軸を共有する
constrained_layout=True, # Subplot 間の間隔を改善
)
for i, col in enumerate(df.iloc[:, 1:].columns):
r = i // cols
c = i % cols
# print(i, col, r, c)
ax[r][c].scatter(df['x'], df[col], marker='o', alpha=0.5, label=col)
ax[r][c].set_xlim(0, 10.5)
ax[r][c].set_ylim(-10, 20)
ax[r][c].grid()
ax[r][c].legend(loc='upper right', fontsize='large')
fig.supxlabel('x', fontsize='x-large') # 全体の横軸ラベル
fig.supylabel('y', fontsize='x-large') # 全体の縦軸ラベル
# plt.savefig('fig.png', dpi=300, facecolor='white')
plt.show()
念の為,相関係数を計算して表示してみます.
相関係数
xy = df.iloc[:,:].values
result = np.corrcoef(xy.T)
print(result[0])
[ 1.00000000e+00 -1.00000000e+00 -9.00917377e-01 -6.93536658e-01 -4.30825963e-01 -2.75999417e-04 4.30825963e-01 6.93536658e-01 9.00917377e-01 1.00000000e+00]