fn_fig = '/Users/dbyrne/Projects/CO9_AMM15/data/figs/ha_variance' ha = xr.open_dataset(fn_out) ana = xr.open_dataset(fn_ana) const = 'M2' file_type = '.png' #%% Anal map plots ind0 = ana.ana_length <= 30 ind1 = np.logical_and(ana.ana_length <= 90, ana.ana_length > 30) ind2 = np.logical_and(ana.ana_length <= 180, ana.ana_length > 90) ind3 = np.logical_and(ana.ana_length <= 365, ana.ana_length > 180) ind4 = ana.ana_length > 365 f, a = pu.create_geo_axes([-15, 15], [45, 65]) sca = a.scatter(ana.longitude[ind0], ana.latitude[ind0], zorder=100, s=2) sca = a.scatter(ana.longitude[ind1], ana.latitude[ind1], zorder=70, s=4) sca = a.scatter(ana.longitude[ind2], ana.latitude[ind2], zorder=60, s=6) sca = a.scatter(ana.longitude[ind3], ana.latitude[ind3], zorder=50, s=10) sca = a.scatter(ana.longitude[ind4], ana.latitude[ind4], zorder=40, s=10, marker='s', color='k') f.legend( ['l <= 30', '30 < l <= 90', '90 < l <= 180', '180 < l <= 365', 'l > 365'], loc='lower right') a.set_title('tideanal.edited locations and analysis length') fn = "ana_lengths{0}".format(file_type)
def __init__(self, fn_ssh_hourly_stats1, fn_ssh_hourly_stats2, dn_out, run_name1, run_name2, file_type='.png'): stats1 = xr.open_dataset(fn_ssh_hourly_stats1) stats2 = xr.open_dataset(fn_ssh_hourly_stats2) lonmax = np.max(stats1.longitude) lonmin = np.min(stats1.longitude) latmax = np.max(stats1.latitude) latmin = np.min(stats1.latitude) lonbounds = [lonmin - 4, lonmax + 4] latbounds = [latmin - 4, latmax + 4] ### GEOGRAPHICAL SCATTER PLOTS # Plot correlations f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.ntr_corr, vmin=.85, vmax=1, edgecolors='k', linewidths=.5, zorder=100) f.colorbar(sca) a.set_title( 'Hourly NTR Correlations with Tide Gauge | {0}'.format(run_name), fontsize=9) fn = "ssh_hourly_ntr_correlations_" + run_name + file_type f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot std_err f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.std_err, vmin=-.15, vmax=.15, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title('Hourly SSH St. Dev Error (m) | {0}'.format(run_name), fontsize=9) fn = "ssh_hourly_stderr_" + run_name + file_type f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot mae f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.ntr_mae, vmin=-.05, vmax=.05, edgecolors='k', linewidths=.5, zorder=100) f.colorbar(sca) a.set_title('Hourly NTR MAE (m) | {0}'.format(run_name), fontsize=9) fn = "ssh_hourly_ntr_mae_" + run_name + file_type f.savefig(os.path.join(dn_out, fn)) plt.close('all') ### HARMONIC ERRORS constit = stats.constituent.values n_constit = len(constit) for cc in range(0, n_constit): # AMPLITUDE MAP f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.amp_err[:, cc], vmin=-.2, vmax=.2, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title('Amplitude Error (m) | {1} - Obs | {0}'.format( constit[cc], run_name), fontsize=9) fn = "ssh_hourly_amp_err_{0}_{1}{2}".format( constit[cc], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # PHASE MAP f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.pha_err[:, cc], vmin=-15, vmax=15, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title('Phase Error (deg) | {1} - Obs | {0}'.format( constit[cc], run_name), fontsize=9) fn = "ssh_hourly_pha_err_{0}_{1}{2}".format( constit[cc], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # AMPLITUDE SCATTER f, a = pu.scatter_with_fit(stats.amp_mod[:, cc], stats.amp_obs[:, cc]) a.set_title('Amplitude Comparison | {0} | {1}'.format( constit[cc], run_name), fontsize=9) a.set_xlabel("Model Amplitude (m)") a.set_ylabel("Observed Amplitude (m)") fn = "ssh_hourly_scatter_amp_{0}_{1}{2}".format( constit[cc], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # PHASE SCATTER f, a = pu.scatter_with_fit(stats.pha_mod[:, cc], stats.pha_obs[:, cc]) a.set_title('Phase Comparison | {0} | {1}'.format( constit[cc], run_name), fontsize=9) a.set_xlabel("Model Phase(deg)") a.set_ylabel("Observed Phase (deg)") fn = "ssh_hourly_scatter_pha_{0}_{1}{2}".format( constit[cc], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') ### CLIM VAR ERROR # Jan m_ind = [0, 3, 6, 9] m_str = ['Jan', 'Mar', 'Jul', 'Oct'] n_m = len(m_ind) for mm in range(0, n_m): f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.ntr_mod_clim_var[:, m_ind[mm]] - stats.ntr_obs_clim_var[:, m_ind[mm]], vmin=-.05, vmax=.05, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title( 'Climatological Variance Error | {1} | var({0}) - var(Obs)'. format(run_name, m_str[mm]), fontsize=9) fn = "ssh_hourly_clim_var_error_{0}_{1}{2}".format( m_str[mm], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') ### FITTED SCATTER PLOTS # Plot st.dev comparisons f, a = pu.scatter_with_fit(stats.skew_mod, stats.skew_obs) a.set_title('Skew Surge Comparison | {0}'.format(run_name), fontsize=9) a.set_xlabel("{0} SSH st. dev (m)".format(run_name)) a.set_ylabel("PSMSL SSH st. dev (m)") fn = "ssh_hourly_skew_scatter_{0}{1}".format(run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') return
def __init__(self, fn_monthly_ssh_stats0, fn_monthly_ssh_stats1, dn_out, run_names, file_type='.png'): stats0 = xr.open_dataset(fn_monthly_ssh_stats0) stats1 = xr.open_dataset(fn_monthly_ssh_stats1) lonmax = np.max(stats0.longitude) lonmin = np.min(stats0.longitude) latmax = np.max(stats0.latitude) latmin = np.min(stats0.latitude) lonbounds = [lonmin - 4, lonmax + 4] latbounds = [latmin - 4, latmax + 4] # Plot correlations f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats0.longitude, stats0.latitude, c=stats0.corr - stats1.corr, vmin=-.03, vmax=.03, edgecolors='k', linewidths=.5, zorder=100, cmap='PiYG') f.colorbar(sca) a.set_title( "SSH correlation difference {1} - {0} (m)\n Correlations between monthly mean model SSH and PSMSL" .format(run_names[1], run_names[0]), fontsize=9) fn = "ssh_diff_corr_{0}_{1}{2}".format(run_names[0], run_names[1], file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot std_err f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats0.longitude, stats0.latitude, c=np.abs(stats1.std_err) - np.abs(stats0.std_err), vmin=-.01, vmax=.01, edgecolors='k', linewidths=.5, zorder=100, cmap='PiYG') f.colorbar(sca) a.set_title( 'Absolute St. Dev Error Difference {0} - {1} (m) \n Error between monthly mean model SSH and PSMSL' .format(run_names[1], run_names[0]), fontsize=9) fn = "ssh_diff_stderr_{0}_{1}{2}".format(run_names[0], run_names[1], file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot mae f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats0.longitude, stats0.latitude, c=stats1.mae - stats0.mae, vmin=-.01, vmax=.01, edgecolors='k', linewidths=.5, zorder=100, cmap='PiYG') f.colorbar(sca) a.set_title( 'MAE Difference {0} - {1} (m) \n Error between monthly mean model SSH and PSMSL' .format(run_names[1], run_names[0]), fontsize=9) fn = "ssh_diff_mae_{0}_{1}{2}".format(run_names[0], run_names[1], file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all')
def __init__(self, fn_ssh_hourly_stats, dn_out, run_name, file_type='.png'): stats = xr.open_dataset(fn_ssh_hourly_stats) lonmax = np.max(stats.longitude) lonmin = np.min(stats.longitude) latmax = np.max(stats.latitude) latmin = np.min(stats.latitude) lonbounds = [lonmin - 4, lonmax + 4] latbounds = [latmin - 4, latmax + 4] ### GEOGRAPHICAL SCATTER PLOTS # Plot correlations f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.ntr_corr, vmin=.85, vmax=1, edgecolors='k', linewidths=.5, zorder=100) f.colorbar(sca) a.set_title( 'Hourly NTR Correlations with Tide Gauge | {0}'.format(run_name), fontsize=9) fn = "ssh_hourly_ntr_correlations_" + run_name + file_type f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot std_err f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.std_err, vmin=-.15, vmax=.15, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title('Hourly SSH St. Dev Error (m) | {0}'.format(run_name), fontsize=9) fn = "ssh_hourly_stderr_" + run_name + file_type f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot mae f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.ntr_mae, vmin=-.05, vmax=.05, edgecolors='k', linewidths=.5, zorder=100) f.colorbar(sca) a.set_title('Hourly NTR MAE (m) | {0}'.format(run_name), fontsize=9) fn = "ssh_hourly_ntr_mae_" + run_name + file_type f.savefig(os.path.join(dn_out, fn)) plt.close('all') ### HARMONIC ERRORS constit = stats.constituent.values n_constit = len(constit) for cc in range(0, n_constit): # AMPLITUDE MAP f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.amp_err[:, cc], vmin=-.2, vmax=.2, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title('Amplitude Error (m) | {1} - Obs | {0}'.format( constit[cc], run_name), fontsize=9) fn = "ssh_hourly_amp_err_{0}_{1}{2}".format( constit[cc], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # PHASE MAP f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.pha_err[:, cc], vmin=-15, vmax=15, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title('Phase Error (deg) | {1} - Obs | {0}'.format( constit[cc], run_name), fontsize=9) fn = "ssh_hourly_pha_err_{0}_{1}{2}".format( constit[cc], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # AMPLITUDE SCATTER f, a = pu.scatter_with_fit(stats.amp_mod[:, cc], stats.amp_obs[:, cc]) a.set_title('Amplitude Comparison | {0} | {1}'.format( constit[cc], run_name), fontsize=9) a.set_xlabel("Model Amplitude (m)") a.set_ylabel("Observed Amplitude (m)") fn = "ssh_hourly_scatter_amp_{0}_{1}{2}".format( constit[cc], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # PHASE SCATTER f, a = pu.scatter_with_fit(stats.pha_mod[:, cc], stats.pha_obs[:, cc]) a.set_title('Phase Comparison | {0} | {1}'.format( constit[cc], run_name), fontsize=9) a.set_xlabel("Model Phase(deg)") a.set_ylabel("Observed Phase (deg)") fn = "ssh_hourly_scatter_pha_{0}_{1}{2}".format( constit[cc], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') ### CLIM VAR ERROR # Jan m_ind = [0, 3, 6, 9] m_str = ['Jan', 'Mar', 'Jul', 'Oct'] n_m = len(m_ind) for mm in range(0, n_m): f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.ntr_mod_clim_var[:, m_ind[mm]] - stats.ntr_obs_clim_var[:, m_ind[mm]], vmin=-.05, vmax=.05, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title( 'Climatological Variance Error | {1} | var({0}) - var(Obs)'. format(run_name, m_str[mm]), fontsize=9) fn = "ssh_hourly_clim_var_error_{0}_{1}{2}".format( m_str[mm], run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') ### FITTED SCATTER PLOTS # Plot st.dev comparisons f, a = pu.scatter_with_fit(stats.skew_mod.values.flatten(), stats.skew_obs.values.flatten()) a.set_title('Skew Surge Comparison | {0}'.format(run_name), fontsize=9) a.set_xlabel("Model Skew Surge (m)".format(run_name)) a.set_ylabel("Observed Skew Surge (m)") a.set_xlim(-3, 3) a.set_ylim(-3, 3) a.set_title( "Comparison of modelled and observed skew surges | {0}".format( run_name)) fn = "ssh_hourly_skew_scatter_{0}{1}".format(run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # THRESHOLD PLOTS prop = stats.thresh_freq_ntr_mod / stats.thresh_freq_ntr_obs plot_thresh = [5, 10, 15] for pp in range(0, len(plot_thresh)): prop_tmp = prop.isel(threshold=plot_thresh[pp]) f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=prop_tmp, vmin=0, vmax=2, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title( 'Number of model NTR peaks as a proportion of observed NTR peaks \n Threshold = {0}m | {1}' .format(prop_tmp.threshold.values, run_name), fontsize=9) fn = "thresh_freq_{0}_{1}{2}".format(prop_tmp.threshold.values, run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') prop = stats.thresh_int_ntr_mod / stats.thresh_int_ntr_obs plot_thresh = [5, 10, 15] for pp in range(0, len(plot_thresh)): prop_tmp = prop.isel(threshold=plot_thresh[pp]) f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=prop_tmp, vmin=0, vmax=2, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title( 'Model hours over threshold as a proportion of observed time \n Threshold = {0}m | {1}' .format(prop_tmp.threshold.values, run_name), fontsize=9) fn = "thresh_int_{0}_{1}{2}".format(prop_tmp.threshold.values, run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all')
def __init__(self, fn_monthly_ssh_stats, dn_out, run_name, file_type='.png'): stats = xr.open_dataset(fn_monthly_ssh_stats) lonmax = np.max(stats.longitude) lonmin = np.min(stats.longitude) latmax = np.max(stats.latitude) latmin = np.min(stats.latitude) lonbounds = [lonmin - 4, lonmax + 4] latbounds = [latmin - 4, latmax + 4] # Plot correlations f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.corr, vmin=.75, vmax=1, edgecolors='k', linewidths=.5, zorder=100) f.colorbar(sca) a.set_title( 'SSH correlations \n Monthly mean PSMSL tide gauge vs {0} \n Mean Corr = {1}' .format(run_name, np.nanmean(stats.corr)), fontsize=9) fn = "ssh_monthly_correlations_{0}{1}".format(run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot std_err f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.std_err, vmin=-.075, vmax=.075, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title( 'Standard Deviation Difference (m) \n Monthly mean {0} - PSMSL Tide Gauge \n Mean err = {1}' .format(run_name, np.nanmean(stats.std_err)), fontsize=9) fn = "ssh_monthly_stderr_{0}{1}".format(run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot me f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.me, vmin=-.05, vmax=.05, edgecolors='k', linewidths=.5, zorder=100, cmap='seismic') f.colorbar(sca) a.set_title( 'Mean Error (m) \n Monthly mean {0} - PSMSL Tide Gauge \n Mean ME = {1}' .format(run_name, np.nanmean(stats.me)), fontsize=9) fn = "ssh_monthly_me_{0}{1}".format(run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot mae f, a = pu.create_geo_axes(lonbounds, latbounds) sca = a.scatter(stats.longitude, stats.latitude, c=stats.mae, vmin=0, vmax=.05, edgecolors='k', linewidths=.5, zorder=100) f.colorbar(sca) a.set_title( 'Mean Absolute Error (m) \n Monthly mean {0} - PSMSL Tide Gauge \n Mean MAE = {1}' .format(run_name, np.nanmean(stats.mae)), fontsize=9) fn = "ssh_monthly_mae_{0}{1}".format(run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all') # Plot st.dev comparisons f, a = pu.scatter_with_fit(stats.std_mod, stats.std_obs) a.set_title( 'Monthly SSH standard deviation comparison (m) \n {0} vs {1}'. format(run_name, 'PSMSL'), fontsize=9) a.set_xlabel("{0} SSH st. dev (m)".format(run_name)) a.set_ylabel("PSMSL SSH st. dev (m)") fn = "ssh_monthly_stdev_scatter_{0}{1}".format(run_name, file_type) f.savefig(os.path.join(dn_out, fn)) plt.close('all')