- 积分
- 653
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2015-4-21
- 最后登录
- 1970-1-1
![未绑定新浪微博用户 新浪微博达人勋](source/plugin/sina_login/img/gray.png)
|
3金钱
大家好,有一个问题一直查不出错来,想要请教各位大神。
目前手头上有自己封装的NC文件,包含41年的tmax,tmin,precipitation的逐日降水资料及其经纬度。
现在是在每年每个季节的变量进行95的分位线计算(降水加一个对大于0的情况才进行95th分位),代码没有报错,但是画图出来令人匪夷所思。比如东亚的tmax,95th分位线上的夏季还是有-15度,然后降水的图出来也不是很好看,我想可能是哪个算法出了问题,还请各位大神帮我看看。
以下是代码:
- import matplotlib.pyplot as plt
- import matplotlib.cm as cm
- import cartopy.crs as ccrs
- from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
- import cartopy.feature as cfeature
- import xarray as xr
- import numpy as np
- import pandas as pd
- from pylab import *
- from tqdm import tqdm
- f = xr.open_dataset("/Volumes/Forests/era rusults/EA/data_day.nc")
- ##f = xr.open_dataset('/Volumes/Forests/all sources data/1961-2018/CN05.1_Tmin_1961_2018_daily_025x025.nc',mask_and_scale=True)##我们输出的日数据###
- tmin = f["tmin"] - 273.15
- tmax = f["tmax"] - 273.15
- pre = f["pre"] * 1000
- lat = tmin.latitude
- lon = tmin.longitude
- def year_season_cal(var, year_s=1979,year_e=2019):
- year = np.arange(year_s,year_e+1,1)
- season_var = var[:4,:,:].expand_dims({"year":year},axis=0).copy()
- for i in range(0,len(year)):
- ind, = np.where((var.time.dt.season== 'MAM')&(var.time.dt.year==year[i]))
- season_var.values[i,0]= np.nanpercentile(var[ind],95,axis=0)
- ind, = np.where((var.time.dt.season== 'JJA')&(var.time.dt.year==year[i]))
- season_var.values[i,1]= np.nanpercentile(var[ind],95,axis=0)
- ind, = np.where((var.time.dt.season== 'SON')&(var.time.dt.year==year[i]))
- season_var.values[i,2] = np.nanpercentile(var[ind],95,axis=0)
- ind = ind+91
- season_var.values[i,3] = np.percentile(var[ind],95,axis=0)
- return(season_var)
- tmin_season = year_season_cal(tmin, year_s=1979,year_e=2019)
- tmax_season = year_season_cal(tmax, year_s=1979,year_e=2019)
- def pre_year_season_cal(var,year_s=1979,year_e=2019):
- year = np.arange(year_s,year_e+1,1)
- season_var = var[:4,:,:].expand_dims({"year":year},axis=0).copy()
- var_ = np.where(var==0,np.nan,var)
- for i in range(0,len(year)):
- ind, = np.where((var.time.dt.season== 'MAM')&(var.time.dt.year==year[i]))
- season_var.values[i,0] = np.nanpercentile(var_[ind],95,axis=0)
- ind, = np.where((var.time.dt.season== 'JJA')&(var.time.dt.year==year[i]))
- season_var.values[i,1] = np.nanpercentile(var_[ind],95,axis=0)
- ind, = np.where((var.time.dt.season== 'SON')&(var.time.dt.year==year[i]))
- season_var.values[i,2] = np.nanpercentile(var_[ind],95,axis=0)
- ind = ind+91
- season_var.values[i,3] = np.nanpercentile(var_[ind],95,axis=0)
- return(season_var)
- pre_season = pre_year_season_cal(pre, year_s=1979,year_e=2019)
- tmin1 = np.zeros((4,len(lat),len(lon)))
- for dd in range(4):
- tmin1[dd,:,:] = np.mean(tmax_season[:,dd,:,:],axis=0)
- def plot(tmin1,lat,lon,cmap = plt.get_cmap("Spectral_r"),levels=19):
- fig, axes = plt.subplots(2, 2,figsize=(10,10),subplot_kw=dict(projection=ccrs.PlateCarree()))
- label = ["MAM", "JJA","SON","DJF"]
- for i, ax in enumerate(axes.flat):
- ax.set_extent([100, 145, 20, 50], crs=ccrs.PlateCarree())
- ax.set_xticks(np.linspace(100,145,5), crs=ccrs.PlateCarree())
- ax.set_yticks(np.linspace(20,50,5), crs=ccrs.PlateCarree())
- ax.add_feature(cfeature.LAND.with_scale('10m'))
- ax.add_feature(cfeature.OCEAN, zorder = 100, color = 'w')
- ax.add_feature(cfeature.COASTLINE.with_scale('10m'),lw=3)
- ax.add_feature(cfeature.BORDERS.with_scale('50m'),linestyle='-',lw=3)
- lon_formatter = LongitudeFormatter(number_format='.1f', degree_symbol=r'$^o
- )
- lat_formatter = LatitudeFormatter(number_format='.1f', degree_symbol=r'$^o
- )
- ax.xaxis.set_major_formatter(lon_formatter)
- ax.yaxis.set_major_formatter(lat_formatter)
- ax.tick_params(labelsize=8)
- cf = ax.contourf(lon, lat, tmin1[i], cmap=cmap,levels= levels, extend='both')
- ax.set_title(label[i], loc="left",fontsize=10)
- ax.set_title("Annual 95thTmax", loc="right",fontsize=10)
- cbar = plt.colorbar(cf, ax=ax, orientation='horizontal',
- extendrect=False, pad=0.08, shrink=0.8)
- cbar.ax.tick_params(labelsize=8)
- plt.subplots_adjust(wspace=0.15, hspace=0.03)
- plt.savefig("Annual 95thTmax.png")
- plot(tmin1,lat,lon)
复制代码
|
-
澳大利亚降水95分位线
-
东亚的95tmax
|