LoginSignup
142
178

More than 3 years have passed since last update.

上司を納得させるための図を描くのに必要なmatplotlibの早見表

Last updated at Posted at 2020-09-09

機械学習などで特徴量を検討していると、色々と図を描きたくなります。
他人(特に上司とか、上司とか、上司とか。。。)に説明するのにも図が重要です。
分かりやすく書かないと、やり直しさせられます。
その時に役立ちそうな処理を一覧にしました。

インポート

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()
142
178
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
142
178