i1 = np.where( t < 1997) i2 = np.where((t > 1997) & ( t < 2000)) i3 = np.where((t > 2000) & ( t < 2002)) i4 = np.where((t > 2002) & ( t < 2004)) i5 = np.where(t > 2004) plt.imshow(h0[10,...], extent=(lon[0], lon[-1], lat[0], lat[-1]), origin='lower', interpolation='nearest') # plot GPS locations plt.plot(x[i1], y[i1], 'b.', mec='blue', label='1995') plt.plot(x[i2], y[i2], 'c.', mec='cyan', label='1999') plt.plot(x[i3], y[i3], 'g.', mec='green', label='2001') plt.plot(x[i4], y[i4], 'y.', mec='yellow', label='2003') plt.plot(x[i5], y[i5], 'r.', mec='red', label='2006') plt.legend(loc=3).draw_frame(False) ap.intitle('Amery GPS locations', 2) plt.xlabel('x (km)') plt.ylabel('y (km)') plt.grid(True) plt.gcf().autofmt_xdate() plt.savefig('gps_locations_amery.png', bbox_inches='tight') plt.show() ''' # plot GPS time series plt.plot(t[i1], h[i1], 'b.', mec='blue') plt.plot(t[i2], h[i2], 'c.', mec='cyan') plt.plot(t[i3], h[i3], 'g.', mec='green') plt.plot(t[i4], h[i4], 'y.', mec='yellow') plt.plot(t[i5], h[i5], 'r.', mec='red') ap.intitle('Amery GPS tseries', 2)
yy = np.polyval(pol, time) #axs[i,j].fill_between(time, s.values+2*r, s.values-2*r, facecolor='0.5', # edgecolor='w', alpha=0.2) #axs[i,j].plot(time, zeros, ':', c='0.5', linewidth=0.5) axs[i,j].plot(time, y, c='0.2', linewidth=0.75, zorder=2) axs[i,j].plot(time, s.values, 's', c='0.5', markersize=4, zorder=1) if 0: axs[i,j].plot(time, yy, c='b', linewidth=1.5, zorder=2) if 1: axs[i,j].plot(time, ap.lasso_cv(time, s, max_deg=3), c='b', linewidth=1.75, zorder=4) # set plots #------------------------------------------------------------- if i == 0: ap.intitle('%s %.2f %s' % (k, m, UNITS), ax=axs[i,j], loc=8, pad=-1, borderalpha=0.7) else: ap.intitle('%s %.2f' % (k, m), ax=axs[i,j], loc=8, pad=-1, borderalpha=0.7) if i != nrows-1: ap.adjust_spines(axs[i,j], ['left'], pad=15) else: ap.adjust_spines(axs[i,j], ['left', 'bottom'], pad=15) axs[i,j].set_xticks([1994, 1997, 2000, 2003, 2006, 2009, 2012]) mn, mx = ap.get_limits(s) axs[i,j].set_yticks([mn, 0, mx]) axs[i,j].set_ylim(mn, mx) axs[i,j].set_xlim(1994, 2012) axs[i,j].tick_params(axis='both', direction='out', length=6, width=1, labelsize=12)
if 0: axs[i, j].plot(time, yy, c='b', linewidth=1.5, zorder=2) if 1: axs[i, j].plot(time, ap.lasso_cv(time, s, max_deg=3), c='b', linewidth=1.75, zorder=4) # set plots #------------------------------------------------------------- if i == 0: ap.intitle('%s %.2f %s' % (k, m, UNITS), ax=axs[i, j], loc=8, pad=-1, borderalpha=0.7) else: ap.intitle('%s %.2f' % (k, m), ax=axs[i, j], loc=8, pad=-1, borderalpha=0.7) if i != nrows - 1: ap.adjust_spines(axs[i, j], ['left'], pad=15) else: ap.adjust_spines(axs[i, j], ['left', 'bottom'], pad=15) axs[i, j].set_xticks([1994, 1997, 2000, 2003, 2006, 2009, 2012]) mn, mx = ap.get_limits(s)
i3 = np.where((t > 2000) & (t < 2002)) i4 = np.where((t > 2002) & (t < 2004)) i5 = np.where(t > 2004) plt.imshow(h0[10, ...], extent=(lon[0], lon[-1], lat[0], lat[-1]), origin='lower', interpolation='nearest') # plot GPS locations plt.plot(x[i1], y[i1], 'b.', mec='blue', label='1995') plt.plot(x[i2], y[i2], 'c.', mec='cyan', label='1999') plt.plot(x[i3], y[i3], 'g.', mec='green', label='2001') plt.plot(x[i4], y[i4], 'y.', mec='yellow', label='2003') plt.plot(x[i5], y[i5], 'r.', mec='red', label='2006') plt.legend(loc=3).draw_frame(False) ap.intitle('Amery GPS locations', 2) plt.xlabel('x (km)') plt.ylabel('y (km)') plt.grid(True) plt.gcf().autofmt_xdate() plt.savefig('gps_locations_amery.png', bbox_inches='tight') plt.show() ''' # plot GPS time series plt.plot(t[i1], h[i1], 'b.', mec='blue') plt.plot(t[i2], h[i2], 'c.', mec='cyan') plt.plot(t[i3], h[i3], 'g.', mec='green') plt.plot(t[i4], h[i4], 'y.', mec='yellow') plt.plot(t[i5], h[i5], 'r.', mec='red') ap.intitle('Amery GPS tseries', 2) plt.xlabel('time')
def main(): fname_in = sys.argv[1] din = GetData(fname_in, 'a') satname = din.satname time = change_day(din.time, 15) # change all days (e.g. 14,15,16,17) to 15 ts = getattr(din, VAR_TO_CALIBRATE) err = din.dh_error n_ad = din.n_ad n_da = din.n_da lon = din.lon lat = din.lat din.file.close() t = ap.num2year(time) if SUBSET: # get subset ts, lon2, lat2 = ap.get_subset(ap.amundsen, ts, lon, lat) err, lon2, lat2 = ap.get_subset(ap.amundsen, err, lon, lat) n_ad, lon2, lat2 = ap.get_subset(ap.amundsen, n_ad, lon, lat) n_da, lon2, lat2 = ap.get_subset(ap.amundsen, n_da, lon, lat) lon, lat = lon2, lat2 xx, yy = np.meshgrid(lon, lat) nt, ny, nx = ts.shape offset_12 = np.full((ny, nx), np.nan) offset_23 = np.full((ny, nx), np.nan) print 'cross-calibrating time series:', VAR_TO_CALIBRATE isfirst = True if SAT_NAMES is None: satnames = np.unique(din.satname) # iterate over every grid cell (all times) no_overlap_12 = 0 no_overlap_23 = 0 for i in xrange(ny): for j in xrange(nx): if 0: i, j = ap.find_nearest2(xx, yy, (LON, LAT)) i -= 0 j += 0 print 'grid-cell:', i, j ts_ij = ts[:, i, j] if np.isnan(ts_ij).all(): continue # get all time series (all sats) in one df (per grid-cell) var = create_df_with_sats(time, ts_ij, satname, SAT_NAMES) if DETREND: var = var.apply(detrend) if FILTER: var = var.apply(ap.hp_filt, lamb=7, nan=True) if PLOT_TS and (var.count().sum() > 10): print 'grid-cell:', i, j var.plot(linewidth=3, figsize=(9, 3), legend=False) plt.title('Elevation change, dh (lon=%.2f, lat=%.2f)' % (xx[i, j], yy[i, j])) plt.ylabel('m') plt.show() # compute offset (if ts overlap) #--------------------------------------------------- x = pd.notnull(var) overlap_12 = x['ers1'] & x['ers2'] overlap_23 = x['ers2'] & x['envi'] if np.sometrue(overlap_12): if SAT_BIAS: s1 = var['ers1'][overlap_12] s2 = var['ers2'][overlap_12] if LINEAR_FIT: # using linear fit s1 = s1[s1.notnull() & s2.notnull()] s2 = s2[s1.notnull() & s2.notnull()] if len(s1) > 1 and len(s2) > 1: s1.index, s1[:] = ap.linear_fit( ap.date2year(s1.index), s1.values) s2.index, s2[:] = ap.linear_fit( ap.date2year(s2.index), s2.values) offset = (s1.values[-1] - s1.values[0]) - ( s2.values[-1] - s2.values[0]) else: pass else: # using absolute values s1 = ap.referenced(s1, to='first') s2 = ap.referenced(s2, to='first') s1[0], s2[0] = np.nan, np.nan # remove first values offset = np.nanmean(s1 - s2) #pd.concat((s1, s2), axis=1).plot(marker='o') else: offset = np.nanmean(var['ers1'] - var['ers2']) offset_12[i, j] = offset else: no_overlap_12 += 1 if np.sometrue(overlap_23): if SAT_BIAS: s2 = var['ers2'][overlap_23] s3 = var['envi'][overlap_23] if LINEAR_FIT: s2 = s2[s2.notnull() & s3.notnull()] s3 = s3[s2.notnull() & s3.notnull()] if len(s2) > 1 and len(s3) > 1: s2.index, s2[:] = ap.linear_fit( ap.date2year(s2.index), s2.values) s3.index, s3[:] = ap.linear_fit( ap.date2year(s3.index), s3.values) offset = (s2.values[-1] - s2.values[0]) - ( s3.values[-1] - s3.values[0]) else: pass else: s2 = ap.referenced(s2, to='first') s3 = ap.referenced(s3, to='first') s2[0], s3[0] = np.nan, np.nan offset = np.nanmean(s2 - s3) #pd.concat((s2, s3), axis=1).plot(marker='o') #plt.show() else: offset = np.nanmean(var['ers2'] - var['envi']) offset_23[i, j] = offset else: no_overlap_23 += 1 #--------------------------------------------------- mean_offset_12 = np.nanmean(offset_12) median_offset_12 = np.nanmedian(offset_12) mean_offset_23 = np.nanmean(offset_23) median_offset_23 = np.nanmedian(offset_23) if SAVE_TO_FILE: fout = tb.open_file(FNAME_OUT, 'w') fout.create_array('/', 'lon', lon) fout.create_array('/', 'lat', lat) fout.create_array('/', 'offset_12', offset_12) fout.create_array('/', 'offset_23', offset_23) fout.close() if PLOT: plt.figure() plt.subplot(211) offset_12 = ap.median_filt(offset_12, 3, 3) plt.imshow(offset_12, origin='lower', interpolation='nearest', vmin=-.5, vmax=.5) plt.title('ERS1-ERS2') plt.colorbar(shrink=0.8) plt.subplot(212) offset_23 = ap.median_filt(offset_23, 3, 3) plt.imshow(offset_23, origin='lower', interpolation='nearest', vmin=-.5, vmax=.5) plt.title('ERS2-Envisat') #plt.colorbar(shrink=0.3, orientation='h') plt.colorbar(shrink=0.8) plt.figure() plt.subplot(121) o12 = offset_12[~np.isnan(offset_12)] plt.hist(o12, bins=100) plt.title('ERS1-ERS2') ax = plt.gca() ap.intitle('mean/median = %.2f/%.2f m' % (mean_offset_12, median_offset_12), ax=ax, loc=2) plt.xlim(-1, 1) plt.subplot(122) o23 = offset_23[~np.isnan(offset_23)] plt.hist(o23, bins=100) plt.title('ERS2-Envisat') ax = plt.gca() ap.intitle('mean/median = %.2f/%.2f m' % (mean_offset_23, median_offset_23), ax=ax, loc=2) plt.xlim(-1, 1) plt.show() print 'calibrated variable:', VAR_TO_CALIBRATE print 'no overlaps:', no_overlap_12, no_overlap_23 print 'mean offset:', mean_offset_12, mean_offset_23 print 'median offset:', median_offset_12, median_offset_23 print 'out file ->', FNAME_OUT
#plt.ylabel('Surface elevation (m)') plt.ylabel('meters or dB') plt.savefig('tseries_bs.png', bbox_inches='tight') plt.show() ''' # correlation of time series plt.figure(figsize=(12,5)) ax1 = plt.subplot(121) df_alt = df_alt0.copy() alt, firn = df_alt0.unstack().values, df_firn.unstack().values i, = np.where((~np.isnan(alt)) & (~np.isnan(firn))) corrcoef = np.corrcoef(alt[i], firn[i])[0,1] plt.scatter(df_alt.unstack(), df_firn.unstack(), marker='.', color='b', alpha=.5) plt.title('Individual time series') ap.intitle('correlation = %.2f' % corrcoef, 4, ax=ax1) #plt.xlabel('Altimetry, backscatter (dB)') plt.xlabel('Altimetry dh/dt (m/yr)') plt.ylabel('Firn model dh/dt (m/yr)') plt.xlim(-10, 10) plt.ylim(-2, 2) #plt.savefig('scatter_bs.png', bbox_inches='tight') ### ax2 = plt.subplot(122) corrcoef = np.corrcoef(df_alt.mean(axis=1), df_firn.mean(axis=1))[0,1] plt.scatter(df_alt.mean(axis=1), df_firn.mean(axis=1), s=70, marker='o', color='b', alpha=.8) plt.title('Average time series') ap.intitle('correlation = %.2f' % corrcoef, 4, ax=ax2) #plt.xlabel('Altimetry, backscatter (dB)') plt.xlabel('Altimetry dh/dt (m/yr)') #plt.ylabel('Firn model, elevation (m)')
''' # correlation of time series plt.figure(figsize=(12, 5)) ax1 = plt.subplot(121) df_alt = df_alt0.copy() alt, firn = df_alt0.unstack().values, df_firn.unstack().values i, = np.where((~np.isnan(alt)) & (~np.isnan(firn))) corrcoef = np.corrcoef(alt[i], firn[i])[0, 1] plt.scatter(df_alt.unstack(), df_firn.unstack(), marker='.', color='b', alpha=.5) plt.title('Individual time series') ap.intitle('correlation = %.2f' % corrcoef, 4, ax=ax1) #plt.xlabel('Altimetry, backscatter (dB)') plt.xlabel('Altimetry dh/dt (m/yr)') plt.ylabel('Firn model dh/dt (m/yr)') plt.xlim(-10, 10) plt.ylim(-2, 2) #plt.savefig('scatter_bs.png', bbox_inches='tight') ### ax2 = plt.subplot(122) corrcoef = np.corrcoef(df_alt.mean(axis=1), df_firn.mean(axis=1))[0, 1] plt.scatter(df_alt.mean(axis=1), df_firn.mean(axis=1), s=70, marker='o', color='b', alpha=.8)
def main(): fname_in = sys.argv[1] din = GetData(fname_in, 'a') satname = din.satname time = change_day(din.time, 15) # change all days (e.g. 14,15,16,17) to 15 ts = getattr(din, VAR_TO_CALIBRATE) err = din.dh_error n_ad = din.n_ad n_da = din.n_da lon = din.lon lat = din.lat din.file.close() t = ap.num2year(time) if SUBSET: # get subset ts, lon2, lat2 = ap.get_subset(ap.amundsen, ts, lon, lat) err, lon2, lat2 = ap.get_subset(ap.amundsen, err, lon, lat) n_ad, lon2, lat2 = ap.get_subset(ap.amundsen, n_ad, lon, lat) n_da, lon2, lat2 = ap.get_subset(ap.amundsen, n_da, lon, lat) lon, lat = lon2, lat2 xx, yy = np.meshgrid(lon, lat) nt, ny, nx = ts.shape offset_12 = np.full((ny,nx), np.nan) offset_23 = np.full((ny,nx), np.nan) print 'cross-calibrating time series:', VAR_TO_CALIBRATE isfirst = True if SAT_NAMES is None: satnames = np.unique(din.satname) # iterate over every grid cell (all times) no_overlap_12 = 0 no_overlap_23 = 0 for i in xrange(ny): for j in xrange(nx): if 0: i, j = ap.find_nearest2(xx, yy, (LON,LAT)) i -= 0 j += 0 print 'grid-cell:', i, j ts_ij = ts[:,i,j] if np.isnan(ts_ij).all(): continue # get all time series (all sats) in one df (per grid-cell) var = create_df_with_sats(time, ts_ij, satname, SAT_NAMES) if DETREND: var = var.apply(detrend) if FILTER: var = var.apply(ap.hp_filt, lamb=7, nan=True) if PLOT_TS and (var.count().sum() > 10): print 'grid-cell:', i, j var.plot(linewidth=3, figsize=(9, 3), legend=False) plt.title('Elevation change, dh (lon=%.2f, lat=%.2f)' % (xx[i,j], yy[i,j])) plt.ylabel('m') plt.show() # compute offset (if ts overlap) #--------------------------------------------------- x = pd.notnull(var) overlap_12 = x['ers1'] & x['ers2'] overlap_23 = x['ers2'] & x['envi'] if np.sometrue(overlap_12): if SAT_BIAS: s1 = var['ers1'][overlap_12] s2 = var['ers2'][overlap_12] if LINEAR_FIT: # using linear fit s1 = s1[s1.notnull() & s2.notnull()] s2 = s2[s1.notnull() & s2.notnull()] if len(s1) > 1 and len(s2) > 1: s1.index, s1[:] = ap.linear_fit(ap.date2year(s1.index), s1.values) s2.index, s2[:] = ap.linear_fit(ap.date2year(s2.index), s2.values) offset = (s1.values[-1] - s1.values[0]) - (s2.values[-1] - s2.values[0]) else: pass else: # using absolute values s1 = ap.referenced(s1, to='first') s2 = ap.referenced(s2, to='first') s1[0], s2[0] = np.nan, np.nan # remove first values offset = np.nanmean(s1 - s2) #pd.concat((s1, s2), axis=1).plot(marker='o') else: offset = np.nanmean(var['ers1'] - var['ers2']) offset_12[i,j] = offset else: no_overlap_12 += 1 if np.sometrue(overlap_23): if SAT_BIAS: s2 = var['ers2'][overlap_23] s3 = var['envi'][overlap_23] if LINEAR_FIT: s2 = s2[s2.notnull() & s3.notnull()] s3 = s3[s2.notnull() & s3.notnull()] if len(s2) > 1 and len(s3) > 1: s2.index, s2[:] = ap.linear_fit(ap.date2year(s2.index), s2.values) s3.index, s3[:] = ap.linear_fit(ap.date2year(s3.index), s3.values) offset = (s2.values[-1] - s2.values[0]) - (s3.values[-1] - s3.values[0]) else: pass else: s2 = ap.referenced(s2, to='first') s3 = ap.referenced(s3, to='first') s2[0], s3[0] = np.nan, np.nan offset = np.nanmean(s2 - s3) #pd.concat((s2, s3), axis=1).plot(marker='o') #plt.show() else: offset = np.nanmean(var['ers2'] - var['envi']) offset_23[i,j] = offset else: no_overlap_23 += 1 #--------------------------------------------------- mean_offset_12 = np.nanmean(offset_12) median_offset_12 = np.nanmedian(offset_12) mean_offset_23 = np.nanmean(offset_23) median_offset_23 = np.nanmedian(offset_23) if SAVE_TO_FILE: fout = tb.open_file(FNAME_OUT, 'w') fout.create_array('/', 'lon', lon) fout.create_array('/', 'lat', lat) fout.create_array('/', 'offset_12', offset_12) fout.create_array('/', 'offset_23', offset_23) fout.close() if PLOT: plt.figure() plt.subplot(211) offset_12 = ap.median_filt(offset_12, 3, 3) plt.imshow(offset_12, origin='lower', interpolation='nearest', vmin=-.5, vmax=.5) plt.title('ERS1-ERS2') plt.colorbar(shrink=0.8) plt.subplot(212) offset_23 = ap.median_filt(offset_23, 3, 3) plt.imshow(offset_23, origin='lower', interpolation='nearest', vmin=-.5, vmax=.5) plt.title('ERS2-Envisat') #plt.colorbar(shrink=0.3, orientation='h') plt.colorbar(shrink=0.8) plt.figure() plt.subplot(121) o12 = offset_12[~np.isnan(offset_12)] plt.hist(o12, bins=100) plt.title('ERS1-ERS2') ax = plt.gca() ap.intitle('mean/median = %.2f/%.2f m' % (mean_offset_12, median_offset_12), ax=ax, loc=2) plt.xlim(-1, 1) plt.subplot(122) o23 = offset_23[~np.isnan(offset_23)] plt.hist(o23, bins=100) plt.title('ERS2-Envisat') ax = plt.gca() ap.intitle('mean/median = %.2f/%.2f m' % (mean_offset_23, median_offset_23), ax=ax, loc=2) plt.xlim(-1, 1) plt.show() print 'calibrated variable:', VAR_TO_CALIBRATE print 'no overlaps:', no_overlap_12, no_overlap_23 print 'mean offset:', mean_offset_12, mean_offset_23 print 'median offset:', median_offset_12, median_offset_23 print 'out file ->', FNAME_OUT