はじめに
前回はサブプロットを扱いました。図(Figure)よりも小さいサブプロットという単位でグラフを描画する領域を操作します。サブプロットは、図を分割するレイアウトを行数、列数で指定して、そのレイアウトの中で対象とする位置を指定するのでした。
# ライブラリのインポート
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
# データ
x=np.linspace(0,2*np.pi)
y=np.sin(x)
# Figure,Axesオブジェクトの作成
fig=plt.figure(figsize=(12,6))
ax=fig.add_subplot(3,4,5)
# 描画
ax.plot(x,y)
for i in range(12):
if i==4:
continue
else:
fig.add_subplot(3,4,i+1)
これは、fig=plt.figure(figsize=(12,6))の部分でまず、図(Figure)を作り、続けてax=fig.add_subplot(3,4,5)の部分でサブプロットを作っています。
add_subplot(3,4,5)の分が、Figureを3行4列の領域に分けて、その5番目の領域(Axes)をaxと名付けています。
そして、axと名付けた5番目のAxesにグラフを描画しいているのが、ax.plot(x,y)の分です。add_subplot(行数、列数、位置)と覚えておけば簡単ですね。
前回はサブプロットの作成方法、および、各サブプロットのグラフタイトル、軸タイトルや軸ラベルなどの設定について扱いましたが、今回はサブプロットの間の設定(余白や軸の共有など)方法について学びましょう。
サブプロット周りの余白の調整
冒頭に書いたように図の中にサブプロットを作成した場合、軸の名前や軸ラベルなどが重なってしまうことがあります。このような場合はサブプロット周りの余白を調整することで、これを防ぐようにしましょう。
余白の調整は、subplots_adjusts()を使います。引数としてwspace, hspaceがあります。
# ライブラリのインポート
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
# データ
x=np.linspace(0,2*np.pi)
y=np.sin(x)
# Figure,Axesオブジェクトの作成
fig=plt.figure(figsize=(12,6))
ax=fig.add_subplot(3,4,5)
# サブプロット間の間隔を調整
plt.subplots_adjust(wspace=1, hspace=1)
# 描画
ax.plot(x,y)
for i in range(12):
if i==4:
continue
else:
fig.add_subplot(3,4,i+1)
サブプロット間に余白を設定することができました。これでタイトルや軸ラベルも重ならずに表示することができますね。
軸の共有
次に軸の共有です。複数のプロットを並べて比較するときには、それぞれのプロットに軸を持たせずに共通にしたほうがわかりやすいこともあります。ひかくをする場合は、スケールを合わせる必要があるので、可能であれば軸を共有したほうがわかりやすいだけでなく、設定自体も楽ですね。
- x軸の目盛ラベルを共有する
x軸の目盛ラベルを共有するには、add_subplot()を実行するときにsharex=XXを引数に指定します。 - y軸の目盛ラベルを共有する
y軸の目盛ラベルを共有するには、add_subplot()を実行するときにsharey=XXを引数に指定します。
どちらも同じように設定できるので、ここではx軸の共有について実際にみてみましょう。
まずは軸を共有せずに描画します。
# データ
x1=np.linspace(0,2*np.pi)
x2=np.linspace(0,10)
y1=np.sin(x)
y2=2*x2
# Figure,Axesオブジェクトの作成
fig=plt.figure(figsize=(12,6))
ax1=fig.add_subplot(211)
ax2=fig.add_subplot(212)
# サブプロット間の間隔を調整
plt.subplots_adjust(hspace=0.5)
# 描画
ax1.plot(x1,y1)
ax2.plot(x2,y2)
このように普通にプロットしただけでは、軸は共有されていません。次にadd_subplotするときに、sharexを指定してみましょう。
# データ
x1=np.linspace(0,2*np.pi)
x2=np.linspace(0,10)
y1=np.sin(x)
y2=2*x2
# Figure,Axesオブジェクトの作成
fig=plt.figure(figsize=(12,6))
ax1=fig.add_subplot(211)
ax2=fig.add_subplot(212,sharex=ax1)
# サブプロット間の間隔を調整
plt.subplots_adjust(hspace=0.5)
# 描画
ax1.plot(x1,y1)
ax2.plot(x2,y2)
add_subplotの中で、sharex=ax1とすることで両者のx軸を共有することができました。以外に簡単ですね。
まとめ
いかがでしょうか?「可視化」の投稿が続くのですが、だいぶいろいろできるようになってきたのではないでしょうか?これまでFigureオブジェクトやAxesオブジェクトを作る時に、
Figure:plt.figure()
Axes:fig.add_subplot()
というように、Figureオブジェクトを作ってから、add_subplot()メソッドでAxesオブジェクトを作っていました。実は、はじめからFigureオブジェクトとAxesオブジェクトを同時に作ることもできます。
次回は、サブプロット周りのもう一つのやり方を紹介して、さらに、その場合の軸の共有方法についても紹介することにします。
コメント