かなり癖がある。下記はBasemap上に水蒸気フラックスを描画したときのサンプル。
m=Basemap(projection='cyl',resolution='l',llcrnrlon=LonMin,llcrnrlat=LatMin,urcrnrlon=LonMax,urcrnrlat=LatMax)
Q = m.quiver(X, Y, U, V, angles='uv', scale_units='inches', scale=400)
plt.quiverkey(Q, X=0.95, Y=-0.125, U=400, label='400 [kg/m/s]', labelpos='E', fontproperties={'size': fontsize})
X: 経度、Y:緯度、U:x方向のベクトル量、V:y方向のベクトル量。
2行目でベクトルを図化し、3行目でベクトルの凡例は表示している。
2行目の引数、angles、scale_units、scaleを設定する必要がある。
マニュアル:https://runebook.dev/ja/docs/matplotlib/_as_gen/matplotlib.pyplot.quiver
anglesは''xy"や"uv"などが指定できる。風速や水蒸気フラックスの場合は"uv"が良い。xyでは矢印が(x, y)から(x+u, y+v)にかけてベクトルが描画されるが、"uv"だとuとvの値からベクトルの向きが計算される(u=vなら、45度方向になる)。
scale_unitsは"inches"にする。単位ユニットの長さをがinchesになる。単位ユニットはscaleの値で決まる。
scale:単位ユニットを決めるファクター。ユニットの長さ÷scaleが単位ユニットになる。
3行目の主な引数はX, Y, U, label。
XとYは凡例をどこの位置に書くかというパラメータ。
Uは基準ベクトルの大きさを決めるファクター。quiverで基準ベクトルは1/400に設定されている。1/400*Uで凡例となるベクトルの大きさを求める。
labelは手動。
描画する前に、あらかじめマスクアウトする。
np.ma.masked_whereなどを用いてマスクアウト。
UV = np.sqrt(U**2+V**2)
U = np.ma.masked_where(UV<2, U)
V = np.ma.masked_where(UV<2, V)
gradsでいうskip(var,int)。 下記のような関数で代役できる。
def skip(Var, interval=1):
Out = Var[::interval, ::interval]
return Out
指定範囲のindexを求める必要がある。numpyだとwhereで簡単に取得できる。
RangeはGMTのようにRange = [xmin, xmax, ymin, ymax]と想定している。
def extractgrids(X, Y, Z, Range):
lon0, lon1, lat0, lat1 = Range[0], Range[1], Range[2], Range[3]
index = np.where( (X>=lon0) & (X<=lon1) & (Y>=lat0) & (Y<=lat1))
y0, y1 = np.min(index[0]), np.max(index[0])
x0, x1 = np.min(index[1]), np.max(index[1])
Out = Z[y0:y1, x0:x1]
return Out
datetimeを使って、時間軸を作成する。時間軸の作成は下記の通り。
StrDate = datetime.datetime(2024,6,1,0)
IntHour = 3 # [hour]
nT = 120
x = [StrDate + datetime.timedelta(hours=IntHour*x) for x in range(nT)]
これを踏まえた緯度ー時間断面図は下記のようにすることで作成できる。
StrLat = 22.4 ; EndLat = 40.0 ; IntLat = 0.1
StrDate = datetime.datetime(2024,6,1,0)
EndDate = datetime.datetime(2024,8,1,0)
IntHour = 3 # [hour]
nT = (EndDate-StrDate).days()*24/IntHour
x = [StrDate + datetime.timedelta(hours=IntHour*x) for x in range(nT)]
y = np.arange(StrLat, EndLat, IntLat)
X, Y = np.meshgrid(x, y)
# Draw =============================
fig = plt.figure(figsize=(8,5))
ax = fig.add_subplot(1, 1, 1)
cl = ax.contourf(X, Y, EQPT.T, vmin=300, vmax=360, cmap=cm.rainbow)
ax.set_xlim([StrDate, EndDate])
ax.xaxis.set_major_locator(mdates.DayLocator(bymonthday=None, interval=7, tz=None))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d%b"))
ax.axhline(32.795,color="black", linestyle="dashed")
ax.grid()
ax.scatter(x, bu, color="black", s=10, marker="^")
fig.colorbar(cl)
plt.show()
時間軸の書式はmdates.DateFormatterで、時間軸の間隔はintervalで指定できる。