Python

Python初心者向け:add_subplot/subplot/subplotsの違いを整理

スポンサーリンク


▶ 行と列ごとに描画するグリッド表示について解説した記事もあります。PairGrid( ), Pairplot, FacetGrid( )については以下の記事をご覧ください。

はじめに

今回は、matplotlibで描画する中で、少し混乱しやすいadd_subplot( ), subplot( ), subplots( )について整理しましょう。これらはいずれも、グラフの土台となるFigureオブジェクトに対して、サブプロットを作成するものです。

plt.add_subplot

Figureオブジェクトにグラフを描画するには、subplotを追加する必要があります。add_subplot( )は、サブプロット(matplotlib.axes.Axesクラスのオブジェクト)を追加し、オブジェクトの参照情報が返り値となります。さっそく見てみましょう。

# ライブラリのインポート
import matplotlib.pyplot as plt
%matplotlib inline

# サブプロット領域の追加
fig=plt.figure(figsize=(12,8))
fig.add_subplot(331)
fig.add_subplot(336)
fig.add_subplot(338)

Figureオブジェクトを生成し、それにAxesオブジェクトを追加することで1つのFigure上に3×3のグラフエリアを設定しました。add_subplot( )の引数は、サブプロットの位置を表す3桁の整数です。順に、サブプロットのグリッドの行数、列数、位置を表す整数となります。331なら3×3のグラフエリアを作成し、その1番目にAxesオブジェクトを追加しています。

いま、add_subplot( )を3回実行して331,336,338を指定しているので、3×3のグラフエリアの1番目、5番目、8番目にAxesオブジェクトが追加されました、
※サブプロットの位置を表す整数は、カンマで区切って指定することもできます。

このadd_subplot( )は基本的に上書きとなります。次の例をみるとわかりやすいでしょう。

fig=plt.figure(figsize=(12,8))
fig.add_subplot(331)
fig.add_subplot(336)
fig.add_subplot(338)
fig.add_subplot(224)

3×3のグラフエリアを作成したうえで、2×2のグラフエリアを作成しその4番目にAxesオブジェクトを作成したので、上記のようになります。

スポンサーリンク

plt.subplot

先の例では、Figureオブジェクトを生成し、これにAxesオブジェクトを追加する手順でしたが、plt.subplot( )はサブプロット(Axesオブジェクト)では明示的なFigureオブジェクトの作成が不要です。Figureオブジェクトに対する操作(グラフエリア全体のタイトルの設定や塗りつぶしのカラー設定など)が不要な場合に利用できます。

ax1=plt.subplot(221)
ax2=plt.subplot(224)

add_subplotとの違いは、現在の描画領域(fig = figure()のこと)に追加するメソッドである点です。subplotはsubplot以前に描画していたfigureとかぶった場合、前のfigureを消す性質を持っています。

ax1=plt.subplot(221)
ax2=plt.subplot(224)
ax3=plt.subplot(111)

この結果を予想できますか?最後のplt.subplot(111)によって前に描画していたplt.subplot(221), plt.subplot(224)は消されてしまいます。

plt.subplots

最後にplt.subplots( )です。「s」があるかどうかで挙動が異なるのでややこしいですね。plt.subplots( )ではFigureオブジェクトとAxesオブジェクトが返り値となります。

plt.subplots( )は、fig = figure()をした後、fig.add_subplot(111)した場合と同じになります。

plt.subplots( )では、引数に行数・列数を指定する数字をカンマ区切りとすることに注意してください。

fig,ax=plt.subplots(2,2)

返り値がFigureオブジェクトとAxesオブジェクトが返り値となるのでfig,axに格納しましょう。ここでfig, axを確認してみましょう。

fig

次にaxをみてみましょう。

ax

plt.subplots(2,2)のように2行2列を指定しているので、4つのAxesオブジェクトが生成されます。そのためaxはarrayで返ってきているので、たとえば1番目にグラフを描くには次のようにします。

fig,ax=plt.subplots(2,2)

x=np.linspace(0,5)
y=np.cos(2*np.pi*x)
ax[0,0].plot(x,y)
スポンサーリンク

まとめ

整理してみたらなんかすっきりしました(笑)。個人的には、Figureオブジェクトを消して再描画してしまうplt.subplot( )よりも、plt.add_suplot( )やplt.subplots( )の方が使いやすいと思いました。皆さんはいがかでしたか?

▶ 描画領域に関する知識の整理ができたら、実際にグラフを並べて描画してみましょう。基本から解説した記事はこちらです。

▶ カテゴリ別にプロットする便利な方法を解説しています。以下の記事もどうぞ。

コメント

タイトルとURLをコピーしました