静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念


matplotlibでAxesを真っ白にする(x軸とかy軸なんかを消して非表示にする)

はじめに

 matplotlibでsubplotsを使って適当にグラフを並べるのはよくある処理だと思います。しかし、きれいに長方形で配置できないときもあります。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
data = [(np.random.randint(10, size=(10, )),
         np.random.randint(10, size=(10, ))) for x in range(5)]

fig, axes = plt.subplots(nrows=2, ncols=3)
for (x, y), ax in zip(data, axes.ravel()):
    ax.scatter(x, y)

plt.savefig("fig1.png")

fig1.png
fig1.png

 タイル状に作るので、場合によっては無駄なAxesが生成されます。これが邪魔なので消したいという場合、どうしたらいいのでしょうか?

解決策

 ax.axis("off")みたいにすると消せます。

matplotlib.axes.Axes.axis — Matplotlib 3.1.0 documentation

 あとはこれが呼ばれるようにすればオッケーです。やり方はいろいろありますが(それこそデータを1つずつ個別にプロットすれば簡単)、今回はforループとzipを使っているので、zip_longestで対応してみましょう(この辺は臨機応変に書いてください)。

from itertools import zip_longest
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
data = [(np.random.randint(10, size=(10, )),
         np.random.randint(10, size=(10, ))) for x in range(5)]

fig, axes = plt.subplots(nrows=2, ncols=3)
for xy, ax in zip_longest(data, axes.ravel()):
    if xy is None:
        ax.axis("off")
        continue
    x, y = xy
    ax.scatter(x, y)

plt.savefig("fig2.png")

fig2.png
fig2.png

 うまくいきました。右下がちゃんと真っ白になっています。

まとめ

 私は長年これを知らなくて、画像編集で消したりしていたのですが、ax.axis("off")を覚えたので、これで今後はかっこいいグラフがスマートに描けます。