Help us understand the problem. What is going on with this article?

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

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

インポート

import matplotlib.pyplot as plt

図(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)

図の描画

線を引く

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()

図の出力

画面上に表示。

plt.show()

表示できるものがない環境では以下のように画像で出力。

plt.savefig("aaa.png")

図のクローズ・削除

showしている場合はclose。

plt.close()

さらに図を破棄する。破棄しないとメモリを占有する可能性あり。

plt.clf()
snkmr0221
メーカーでソフトエンジニア・アルゴリズム開発をしています。最近はPythonをおもに書いています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした