#!/usr/bin/env python # Wenchang Yang (wenchang@princeton.edu) # Wed Jul 12 13:23:03 EDT 2023 if __name__ == '__main__': import sys,os from misc.timer import Timer tt = Timer(f'[{os.getcwd()}] start ' + ' '.join(sys.argv)) import sys, os.path, os, glob, datetime import xarray as xr, numpy as np, pandas as pd, matplotlib.pyplot as plt #more imports wython = '/tigress/wenchang/wython' if wython not in sys.path: sys.path.append(wython); print('added to python path:', wython) #from misc import get_kws_from_argv from misc.landmask import whereland import geoxarray import xfilter # if __name__ == '__main__': tt.check('end import') # #start from here lmr_version = '2.1' tspan = [ None, slice('1551', '1650'), ][-1] def get_data(region, tspan=tspan): if region == 'North China': lonlatbox = '106.120.33.40' elif region == 'Northeast China': lonlatbox = '122.130.40.46' elif region == 'Mongolia': lonlatbox = '107.122.40.47' lonlatbox = [float(s) for s in lonlatbox.split('.')] #str to float lonmin, lonmax, latmin, latmax = lonlatbox ifile = f'/tigress/wenchang/data/LMR/v{lmr_version}/prate_MCruns_ensemble_mean_LMRv{lmr_version}.nc' print(ifile) ### if tspan is None: da = xr.open_dataarray(ifile).load() #only the 5 ens of the last millennium else: #concatenate two exps along the ens dim da = xr.open_dataarray(ifile).sel(time=tspan).load() da = da.pipe(whereland).sel(lon=slice(lonmin, lonmax), lat=slice(latmin, latmax)).geo.fldmean() da = da.rename(MCrun='ens') daa = da.groupby('time.month') - da.groupby('time.month').mean('time').mean('ens') daa = daa.groupby('time.year').mean('time') daa = (daa*24*3600).assign_attrs(units='mm/day') return daa das = dict() region = 'North China' das[region] = get_data(region=region) region = 'Northeast China' das[region] = get_data(region=region) region = 'Mongolia' das[region] = get_data(region=region) n_ens = das[region].ens.size def wyplot(ax=None, region='North China', **kws): if ax is None: fig,ax = plt.subplots() #lp = lambda x: x.rolling(year=9, center=True, min_periods=1).mean() n_window = 99 if tspan is None else 9 lp = lambda x: x.filter.lowpass(1/n_window, dim='year', padtype='even') da = das[region] da_lp = da.pipe(lp) mm = da_lp.mean('ens') err = da_lp.std('ens')/np.sqrt(n_ens) ax.fill_between(mm.year, mm-err, mm+err, alpha=0.1, **kws) mm.plot(ax=ax, label=region, **kws) ax.axhline(0, color='gray', ls='--') ax.axvspan(1625, 1644, color='gray', alpha=0.1) ax.set_ylabel(f'mm/day') ax.set_title(f'LMR{lmr_version} {n_ens}ens precip anom, {n_window}LP') if __name__ == '__main__': from wyconfig import * #my plot settings fig, ax = plt.subplots() wyplot(region='North China', ax=ax) wyplot(region='Northeast China', ax=ax) wyplot(region='Mongolia', ax=ax) ax.legend() #savefig if 'savefig' in sys.argv or 's' in sys.argv: figname = __file__.replace('.py', f'__LMR{lmr_version.replace(".", "p")}.png') if tspan is None: figname = figname.replace('.png', '_LM.png') #last millennium results, only 5 ens if 'overwritefig' in sys.argv or 'o' in sys.argv: wysavefig(figname, overwritefig=True) else: wysavefig(figname) tt.check(f'**Done**') print() if 'notshowfig' in sys.argv or 'n' in sys.argv: pass else: if 'plt' in globals(): plt.show()