Python matplotlibで望む任意の位置にサブプロットを描画するか、重ねて描画する方法
概要
plt.subplot
やgridspec
を使えば、グリッドを基にした簡単または複雑なレイアウトでサブプロットを描くことができる。本文では、グリッドに依存しないで、使い手の望む完全に任意の位置にサブプロットを描く方法を紹介する。
コード
fig.add_axes([left, bottom, width, height])
add_axes
を使えば、figureの好きな位置に新しいサブプロットを生成できる。この時、サブプロットの領域は入力引数の[left, bottom, width, height]
で決まる。各項目はfigure全体の比率を表すので、$0 \le$ left
, bottom
, width
, height
$\le 1$を満たす必要がある。例えば、fig.add_axes([0.1, 0.1, 0.2, 0.3])
は、左からfigure全体の幅の$1/10$だけ離れて、下からfigure全体の高さの$1/10$だけ離れた場所に、figure全体の大きさに比例して$0.2 \times 0.3$の大きさのサブプロットを作る。位置の基準はサブプロットの左下だ。
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.1, 0.2, 0.3])
ax1.plot(np.random.randn(10))
plt.show()
完全に任意の位置に描くことができるので、重ねて描くことも可能だ。最初に描いた図が下になる。
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.1, 0.4, 0.8])
ax1.plot(np.random.randn(10))
ax2 = fig.add_axes([0.4, 0.5, 0.4, 0.4])
plt.bar(np.arange(10), np.random.randn(10))
ax3 = fig.add_axes([0.7, 0.4, 0.2, 0.2])
ax3.scatter(np.random.randn(10), np.random.randn(10))
plt.show()
環境
- OS: Windows11
- Version: Python 3.9.13, matplotlib==3.6.2, numpy==1.23.5