web-dev-qa-db-ja.com

add_axesとadd_subplotの違いは何ですか?

以前の answer では、軸を正しく表示するためにadd_subplotではなくadd_axesを使用することをお勧めしましたが、ドキュメントを検索して、いつどのように使用する必要があるのか​​理解できませんでしたこれらの機能のいずれか。

誰でも違いを説明できますか?

44
Ivan

共通の根拠

_add_axes__add_subplot_ の両方で、Axesを図に追加します。どちらも(aのサブクラス)_matplotlib.axes.Axes_オブジェクトを返します。

ただし、軸を追加するために使用されるメカニズムは大幅に異なります。

_add_axes_

_add_axes_ の呼び出し署名はadd_axes(rect)です。ここで、rectはリスト_[x0, y0, width, height]_で、新しい軸の左下の点を示します図は_(x0,y0)_とその幅と高さを座標化します。したがって、座標軸はキャンバス上の絶対座標に配置されます。例えば。

_fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
_

キャンバス自体とまったく同じ大きさの図をキャンバスに配置します。

_add_subplot_

_add_subplot_ の呼び出し署名は、事前に定義された位置に軸を配置するオプションを直接提供しません。むしろ、サブプロットグリッドに従って、軸を配置する場所を指定できます。この位置を指定する通常の最も簡単な方法は、3つの整数表記です。

_fig = plt.figure()
ax = fig.add_subplot(231)
_

この例では、新しい軸が2行3列のグリッドの最初の位置(_1_)に作成されます。単一のAxesのみを生成するには、add_subplot(111)を使用します(1 x 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()
_

enter image description here

オルタナティブ

1つ以上のサブプロットとそれらのハンドルを一緒に取得する最も簡単な方法は plt.subplots() です。 1つの軸に対して、

_fig, ax = plt.subplots()
_

または、より多くのサブプロットが必要な場合は、

_fig, axes = plt.subplots(nrows=3, ncols=4)
_

最初の質問

最初の質問 では、Axesはfig.add_axes([0,0,1,1])を使用して配置され、Figureの境界に密着しました。これの欠点は、もちろん目盛り、目盛りラベル、軸ラベル、およびタイトルが切り取られることです。したがって、私は_fig.add_subplot_を使用するように回答へのコメントの1つで提案しました。これにより、これらの要素のための十分なスペースが自動的に許可され、これが十分でない場合は、pyplot.subplots_adjust(...)またはpyplot.tight_layout()