機械学習などで特徴量を検討していると、色々と図を描きたくなります。
他人(特に上司とか、上司とか、上司とか。。。)に説明するのにも図が重要です。
分かりやすく書かないと、やり直しさせられます。
その時に役立ちそうな処理を一覧にしました。
インポート
import matplotlib.pyplot as plt
補足:かっこよくするための追加のおまじない
import matplotlib as mpl
mpl.style.use('ggplot')
図(fig, ax)の作成
単体
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(15, 8), dpi=100)
ax1 = plt.axes()
なお、figsizeは(横, 縦)のインチ、dpiはインチ当たりの画素数。
つまり、この場合、1500 x 800の画像になる。
dpi=100はデフォルト、figsizeのデフォルトは(6,4)だが、
最近のディスプレイはもっと横長で高画質なので(15,8)にしてみた。
複数
fig = plt.figure(figsize=(15, 8), dpi=100)
ax1 = plt.subplot(2, 2, 1) # 1行1列目
ax2 = plt.subplot(2, 2, 2) # 1行2列目
ax3 = plt.subplot(2, 2, 3) # 2行1列目
ax4 = plt.subplot(2, 2, 4) # 2行2列目
あるいはまとめて、
fig, ax = plt.subplots(2, 2, figsize=(15, 8), dpi=100)
ax1 = ax[0, 0] # 1行1列目
ax2 = ax[0, 1] # 1行2列目
ax3 = ax[1, 0] # 2行1列目
ax4 = ax[1, 1] # 2行2列目
あるいは動的に追加もできる。
fig = plt.figure(figsize=(15, 8), dpi=100)
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)
補足:軸の共有
subplotを使う時に、軸を共有したくなる場合がある。
そのときは、sharex, shareyを使ってsubplotをあらかじめ作成する。
"col"だとx,y軸を縦方向のサブプロットに対して共有する。
"row"だとx,y軸を横方向のサブプロットに対して共有する。
Trueにすると、どちらにも共有する。
fig, ax = plt.subplots(2, 2, sharex="col", sharey="col", figsize=(15, 8), dpi=100)
ax1 = ax[0, 0] # 1行1列目
ax2 = ax[0, 1] # 1行2列目
ax3 = ax[1, 0] # 2行1列目
ax4 = ax[1, 1] # 2行2列目
図の描画
線を引く
import numpy as np
y = np.random.randn(100) # 標準正規分布から100個をサンプリング
x = np.arange(y.shape[0])
ax1.plot(y, x, linewidth=0.5)
linewidthは線の太さ。あと使いそうなのは、color, linestype, marker, label, zorderなどなど。
- linewidth ... 線の太さ。
- linestyle ... 実践や点線などを指定。詳細はこちら
- marker ... マーカー指定。詳細はこちら。
- color ... 線の色。詳細はこちら
- label ... 凡例に使用。後述のax.legend()で表示させることが可能。
- zorder ... どれを表側、裏側に表示させるかの順番を指定。
matplotlib.pyplot.plotが使えるkwargsは上記以外にもあり、Line2Dプロパティが使える。
一応ここにその一覧がある。
散布図
普通の散布図や、波形上のマーカーとしてよく使います。
ax.scatter(0.5, 0.5, s=600, c="red", alpha=0.1)
sはサイズ、cは色、alphaは透過性を設定できます。
文字
例えば、マーカー部分の具体的な数値を表したい場合に使います。
最大値っていうけど、具体的にどのくらい?とかを目盛りを読み取らせずに説明できます。
ax.text(0.5, 0.5, "test", va="bottom", ha="left", color="red")
参考
描画できるものの一覧はここにあります。
それぞれのaxを整える
タイトルをつける
ax1.set_title("タイトル")
軸の範囲を制限する。
ax1.set_xlim([0.0, 1.0])
ax1.set_ylim([0.0, 1.0])
目盛りの間隔を制御する。
ax1.set_xticks([0.0, 0.5, 1.0])
ax1.set_yticks([0.0, 0.5, 1.0])
実際はnp.linspace(最小, 最大, tick数)で作成するのが実用的。
設定した目盛り間隔にラベルを付与
ax1.set_yticklabels(["小", "中", "大"])
凡例を表示
ax1.legend(["test"], fontsize=7, loc="upper left")
plot時にlabelプロパティを指定している場合、["test"]の部分は不要。
fontsizeで文字の大きさ、locで表示する場所を制御できる。
locの設定値はここのLocation Stringを参照。
軸ラベルを表示
ax1.set_ylabel("X軸")
ax1.set_ylabel("Y軸")
グリッドを表示
ax.grid(b=True, linestyle=":")
すべてのaxを表示した後の調整
なんとなく整える呪文
plt.tight_layout()
subplotをまとめたタイトル表示
fig.suptitle('title')
plt.tight_layout(rect=[0,0,1,0.96])
図の出力
画面上に表示。
plt.show()
表示できるものがない環境では以下のように画像で出力。
plt.savefig("aaa.png")
図のクローズ・削除
showしている場合はclose。
plt.close()
さらに図を破棄する。破棄しないとメモリを占有する可能性あり。
plt.clf()