以前の回答で、軸を正しく表示するために add_axes
の代わりに add_subplot
を使うことを勧められましたが、ドキュメントを検索しても、いつ、なぜ、これらの関数のどちらかを使うべきかが分かりませんでした。
どなたか違いを説明していただけませんか?
add_axes
](https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.add_axes) と add_subplot
は共に、図に軸を追加します。どちらも(サブクラスの)matplotlib.axes.Axes
オブジェクトを返します。
しかし、軸を追加するために使用されるメカニズムが大きく異なります。
add_axes
ここで、rect
はリスト [x0, y0, width, height]
で、新しい軸の左下点 (x0,y0)
とその幅と高さを表します。 つまり、軸はキャンバス上の絶対座標で配置されます。例
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
は、キャンバスそのものとちょうど同じ大きさの図形をキャンバス内に配置します。
add_subplot
add_subplot`](https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.add_subplot) の呼び出しシグネチャは、あらかじめ定義された位置に軸を配置するオプションを直接提供するものではありません。むしろ、サブプロットグリッドに従って軸を配置する場所を指定することができます。この位置を指定するための通常かつ最も簡単な方法は、3つの整数表記です。
fig = plt.figure()
ax = fig.add_subplot(231)
この例では、2行3列のグリッドの最初の位置(1
)に新しい軸が作成されます。1つの軸だけを作成するには、 add_subplot(111)
が使用されます(1×1のサブプロットグリッドに最初のプロットを作成します)。(新しい matplotlib のバージョンでは、引数なしの add_subplot()
も可能です)。
このメソッドの利点は、matplotlibが正確な位置決めを行うことです。デフォルトでは add_subplot(111)
は [0.125,0.11,0.775,0.77]
またはそれに似た位置に軸を生成します。しかし、この位置はプロット内の他の要素やタイトルセットなどによって変わることがあります。
これは pyplot.subplots_adjust(...)
や pyplot.tight_layout()
を用いて調整することも可能です。
ほとんどの場合、キャンバス上にプロットの軸を作成するには add_subplot
が好ましい方法でしょう。正確な位置が重要な場合のみ、 add_axes
が役に立つかもしれません。
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (5,3)
fig = plt.figure()
fig.add_subplot(241)
fig.add_subplot(242)
ax = fig.add_subplot(223)
ax.set_title("subplots")
fig.add_axes([0.77,.3,.2,.6])
ax2 =fig.add_axes([0.67,.5,.2,.3])
fig.add_axes([0.6,.1,.35,.3])
ax2.set_title("random axes")
plt.tight_layout()
plt.show()
1つまたは複数のサブプロットとそのハンドルを取得する最も簡単な方法は plt.subplots()
です。1軸の場合は
fig, ax = plt.subplots()
を使用するか、または、より多くのサブプロットが必要な場合は
fig, axes = plt.subplots(nrows=3, ncols=4)
initial question](https://stackoverflow.com/questions/43283643/change-range-withouth-scaling-in-matplot?noredirect=1&lq=1) では fig.add_axes([0,0,1,1])
を使って図の境界線にぴったり合うように軸が配置されていました。この欠点は、もちろん、目盛、目盛り、軸ラベル、タイトルが切り取られてしまうことです。もし十分でなければ、pyplot.subplots_adjust(...)
や pyplot.tight_layout()
を使って調整することができます。