In [288]:
import xray
%matplotlib inline
from glob import glob
import pandas as pd
from matplotlib import pyplot as plt
import os
import numpy as np
In [318]:
keep_vars = ['iDEPTH', 'iPROF', 'depth', 'prof_YYYYMMDD',
'prof_HHMMSS', 'prof_lon', 'prof_lat']
mydepth = 300
def extract_ds(ds, depth, data_var, all_vars):
all_vars = keep_vars + [data_var,]
for v in ds.variables:
if v not in all_vars:
ds = ds.drop(v)
didx = ds['depth'].to_index()
idepth = didx.get_loc(depth, method='nearest')
# time
if data_var in ds.variables:
ds = ds.isel(iDEPTH=idepth)#.drop('iDEPTH')
date = pd.to_datetime(ds.prof_YYYYMMDD, format='%Y%m%d')
ds['date'] = xray.DataArray(date, coords={'iPROF': ds.iPROF.values})
ds = ds.assign_coords(date=ds.date, prof_lon=ds.prof_lon,
prof_lat=ds.prof_lat, depth=ds.depth)
ds = ds.drop(['prof_YYYYMMDD', 'prof_HHMMSS'])
return ds
else:
return None
dsets = {}
for data_var in ['prof_T', 'prof_S']:
dslist = []
for n, f in enumerate(glob('/data/scratch/rpa/SOSE/data/*.nc')):
# check for model file
l = os.path.basename(f).split('.')
l.insert(-1, 'equi.all')
mfname = os.path.join(os.path.dirname(f),'model_equiv',str.join('.',l))
if os.path.exists(mfname):
ds1 = xray.open_dataset(f)
ds2 = xray.open_dataset(mfname)
obs, sose = [extract_ds(ds, mydepth, data_var, keep_vars)
for ds in [ds1,ds2]]
if obs:
obs.rename({data_var: data_var + '_obs'}, inplace=True)
if sose:
sose.rename({data_var: data_var + '_sose'}, inplace=True)
if obs and sose:
ds = obs.merge(sose)
dslist.append(ds)
#dslist.append(newds)
dsets[data_var] = xray.concat(dslist, dim='iPROF',
data_vars=[data_var+'_obs', data_var+'_sose'])
In [298]:
from mpl_toolkits.basemap import Basemap
def southern_ocean_basemap(boundinglat=-60., ax=None,
labels=[1,0,0,1],
land=True, grid=True, **kwargs):
"""Plot something in the southern ocean."""
m = Basemap(projection='spstere',boundinglat=boundinglat, lon_0=180., ax=ax)
if land:
m.drawcoastlines()
m.fillcontinents(color='0.7',lake_color='0.5')
# draw parallels and meridians.
if grid:
m.drawparallels(np.arange(-80.,81.,10.))
m.drawmeridians(np.arange(-180.,181.,30.), labels=labels)
m.drawmapboundary(fill_color='0.2')
return m
In [345]:
for vname, lev, vrange in [('prof_S', 0.2, (33.9,35.)),
('prof_T', 2.0, (-2,10))]:
ds = dsets[vname]
N = len(ds.iPROF) #100000
lon = ds.prof_lon.values[:N]
lat = ds.prof_lat.values[:N]
sose = ds[vname + '_sose'].values
obs = ds[vname + '_obs'].values
T = sose - obs
# I thought there were some weird 0 values
idx = (lat<-55) & (obs!=0.0000) & (sose!=0.0000)
plt.figure(figsize=(15,15))
ax = plt.subplot(111, axisbg='0.3')
m = southern_ocean_basemap(ax=ax)
x, y = m(lon,lat)
scat = m.scatter(x, y, c=T, edgecolor='none', cmap='RdBu_r', s=5, alpha=1.0)
scat.set_clim([-lev,lev])
plt.colorbar(scat, shrink=0.4)
plt.title(vname + ' misfit at %g depth' % mydepth)
plt.figure(figsize=(12,12))
s2=plt.scatter( sose[idx], obs[idx], edgecolor='none',
c=lat[idx], cmap='jet', s=10, alpha=0.2)
plt.xlim(vrange)
plt.ylim(vrange)
plt.grid()
plt.xlabel('SOSE')
plt.ylabel('obs')
plt.title(vname + ' South of 55S')
plt.colorbar(s2, cax=plt.axes((0.8,0.2,0.01,0.3)))
plt.title('lat')
In [ ]: