matplotlibでカラーバーの高さを図と合わせる
ページ下部のリンク先を参考にした.ネットで検索を掛けるとmpl_toolkits.axes_grid1のdividerやmake_axes_locatableを使う解決策が提示されるものの,まどろっこしさが拭えない.そんな遠回りなことをせずともaxで位置を取得できるのだから,それを使ってあげれば単純だろう,という話.
下部のリンク先の情報を元に,カラーバーの水平か鉛直かの方向もオプションとして備えた関数を定義した例を以下に示す.
import numpy as np
import matplotlib.pyplot as plt
def modify_cax(ax, cax, orientation='vertical'):
'''
Set colorbar axis same as plot.
Parameters:
ax: ax = plt.gca()
cax: cax = plt.colorbar()
orientataion: vertical or horizontal
'''
axp = ax.get_position()
caxp = cax.ax.get_position()
if orientation=='vertical':
cax.ax.set_position([caxp.x0, axp.y0, caxp.x1 - caxp.x0, axp.y1 - axp.y0])
elif orientation=='horizontal':
cax.ax.set_position([axp.x0, caxp.y0, axp.x1 - axp.x0, caxp.y1 - caxp.y0])
plt.figure()
data = np.arange(720*1440).reshape(720, 1440)
plt.imshow(data, extent=(-180, 180, -90, 90))
plt.xticks(range(-180, 240, 60))
plt.yticks(range(-90, 120, 30))
ax = plt.gca() # get current axis
# 鉛直カラーバー
cax = plt.colorbar()
modify_cax(ax, cax)
# 水平カラーバー
cax = plt.colorbar(orientation='horizontal')
modify_cax(ax, cax, orientation='horizontal')
鉛直カラーバー使用時のmodify_cax(ax, cax)
実行前
鉛直カラーバー使用時のmodify_cax(ax, cax)
実行後
水平カラーバー使用時のmodify_cax(ax, cax)
実行前
水平カラーバー使用時のmodify_cax(ax, cax)
実行後
非常に直感的かつ簡明な解法である.欠点としては,カラーバーの水平方向開始位置が最初のplt.colorbar()によって規定されるため,図との距離を変えたいときはcaxのpositionなり関数なりを微調整しなければならないこと.とはいえそれはaxes_grid1でも同じことなので,私はこちらの方法を採用する(追記:Basemap使用時かつ水平カラーバーを使う際には幅が自動で合わないことが発覚.Basemapのaxesがplt.figure()のaxesと違うことが原因と考えられるが未解決).
参考リンク