Drawing with python

ベクトルの図化

ベクトルを図化する方法

かなり癖がある。下記は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