Pythonによる気象・気候データ解析I: Pythonの基礎・気候値と偏差・回帰相関分析
注:しばらくAmazonでは品切れなので楽天等で
Pythonによる気象・気候データ解析1 Pythonの基礎・気候値と偏差・回帰相関分析 [ 神山 翼 ]
の章末問題を一つずつ解いていきます。
A
A-1 1997−08
- 本文と同じ年で夏の8月を
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
#!pip install japanize_matplotlib > /dev/null
import japanize_matplotlib
draw_year = 1997
draw_month = 8
vim = -5
vmax = 35
vint = 5
cm = plt.get_cmap('seismic')
cs = plt.contourf(lon2, lat2,
np.squeeze(sst[:, :, (y==draw_year)*(m==draw_month)]),
cmap=cm, norm=Normalize(vmin=vim, vmax=vmax),
levels=np.arange(vim, vmax+vint, vint), extend='both')
plt.colorbar(cs)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.xlim(0, 360)
plt.ylim(-90, 90)
plt.title(str(draw_year)+'/'+str(draw_month))
plt.show()
- 赤い領域が広がっている
A-2 日本近海
draw_year = 1997
draw_month = 8
vim = -5
vmax = 35
vint = 5
cm = plt.get_cmap('seismic')
cs = plt.contourf(lon2, lat2,
np.squeeze(sst[:, :, (y==draw_year)*(m==draw_month)]),
cmap=cm, norm=Normalize(vmin=vim, vmax=vmax),
levels=np.arange(vim, vmax+vint, vint), extend='both')
plt.colorbar(cs)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
# 日本近海
plt.xlim(120, 160)
plt.ylim(30, 50)
plt.title(str(draw_year)+'/'+str(draw_month) + ' 日本近海')
plt.show()
- 同じく draw_month = 12 にしてみると海水温の変化がわかりやすい
A-3
- matplotlibのColorMapのマニュアルを見て寒色暖色系のグラデーションを試してみた
# c.f. https://matplotlib.org/stable/users/explain/colors/colormaps.html
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
#!pip install japanize_matplotlib > /dev/null
import japanize_matplotlib
draw_year = 1997
draw_month = 8
vim = -5
vmax = 35
vint = 5
def draw_sea_temp(cm_name):
cm = plt.get_cmap(cm_name)
cs = plt.contourf(lon2, lat2,
np.squeeze(sst[:, :, (y==draw_year)*(m==draw_month)]),
cmap=cm, norm=Normalize(vmin=vim, vmax=vmax),
levels=np.arange(vim, vmax+vint, vint), extend='both')
plt.colorbar(cs)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.xlim(0, 360)
plt.ylim(-90, 90)
plt.title(str(draw_year)+'/'+str(draw_month)+' '+cm_name)
plt.show()
draw_sea_temp('seismic')
draw_sea_temp('bwr')
draw_sea_temp('coolwarm')
draw_sea_temp('rainbow')
draw_sea_temp('jet')
draw_sea_temp('turbo')
B
B-1
import numpy as np
A = np.array([[1, 2, 4],
[4, 3, 5],
[6, 2, 9]])
B = np.array([5, 5, 4])
print(B==4)
A[:, B==4]
[False False True]
array([[4],
[5],
[9]])
B-2
(draw_year年)かつ(draw_month月)つまり draw_year年draw_month月 のsstの値を取得する。
C
- 気圧は950hPaより小さい値もあるがグラデーションがうまく出ないので高めに950hPaとした。
- 3時間毎にプロットして台風の動きを見えるようにした
vim = 950
vmax = 1030
vint = 5
def draw_typhoon(t):
cm = plt.get_cmap('seismic')
cs = plt.contourf(lon2, lat2,
surface_pressure[:, :, t] / 100,
cmap=cm, norm=Normalize(vmin=vim, vmax=vmax),
levels=np.arange(vim, vmax+vint, vint), extend='both')
plt.colorbar(cs)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.xlim(120, 150)
plt.ylim(23, 45)
plt.title(str(t) + '時')
plt.show()
for t in range(0, 24, 3):
draw_typhoon(t)
- 雲量
cloud = msm_dataset['cloud']
plt.hist(cloud.flatten(), bins=100)
plt.show()
vim = 0
vmax = 100
vint = 5
def draw_cloud(t):
cm = plt.get_cmap('seismic')
cs = plt.contourf(lon2, lat2,
cloud[:, :, t],
cmap=cm, norm=Normalize(vmin=vim, vmax=vmax),
levels=np.arange(vim, vmax+vint, vint), extend='both')
plt.colorbar(cs)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.xlim(120, 150)
plt.ylim(23, 45)
plt.title(str(t) + '時')
plt.show()
for t in range(0, 24, 3):
draw_cloud(t)
D
- 本書発売日 2024-05-01 14:00 の気温を描いてみた
- 「なんらかの現象」までは思いつかず
- 27-30.5 とちょっと高めの気がするがこういうものか
!pip install netCDF4 > /dev/null
import numpy as np
import netCDF4 as nc4
import datetime
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
#!pip install japanize_matplotlib > /dev/null
import japanize_matplotlib
loadfile = 'drive/MyDrive/0501.nc'
msm_data = nc4.Dataset(loadfile)
temperature = msm_data.variables['temp'][:]
temperature = temperature.transpose(2, 1, 0)
temperature = temperature.astype(float)
[imt, jmt, tmt] = temperature.shape
lon = msm_data.variables['lon'][:]
lat = msm_data.variables['lat'][:]
[xgrid2, ygrid2] = np.meshgrid(lon, lat)
lon2 = (xgrid2.T).astype(float)
lat2 = (ygrid2.T).astype(float)
del lon, lat, xgrid2, ygrid2
y = np.zeros(tmt)
m = np.zeros(tmt)
d = np.zeros(tmt)
h = np.zeros(tmt)
date_offset = datetime.datetime(2019, 10, 12)
time = msm_data.variables['time'][:]
for tt in range(0, tmt):
time_data = date_offset + datetime.timedelta(hours=int(time[tt]))
y[tt] = time_data.year
m[tt] = time_data.month
d[tt] = time_data.day
h[tt] = time_data.hour
plt.hist(temperature.flatten())
plt.show()
vim = 27
vmax = 31
vint = 0.5
def draw_temp(t):
cm = plt.get_cmap('seismic')
cs = plt.contourf(lon2, lat2,
temperature[:, :, t] / 10,
cmap=cm, norm=Normalize(vmin=vim, vmax=vmax),
levels=np.arange(vim, vmax+vint, vint), extend='both')
plt.colorbar(cs)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.xlim(120, 150)
plt.ylim(23, 45)
plt.title(str(t) + '時')
plt.show()
draw_temp(14)