Exemple #1
0
def plotRelChngDiff(ax, relChngDiff, mp, txt, cmap='RdBu', vmax=20, vmin=None):
  if mp == None:
    llcrnrlon = -11.5
    llcrnrlat = 23
    urcrnrlon = 44
    urcrnrlat = 74
    mp = bm.Basemap(llcrnrlon=llcrnrlon, llcrnrlat=llcrnrlat, urcrnrlon=urcrnrlon, 
             urcrnrlat=urcrnrlat, resolution='l')

  lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
  lon, lat = lon.transpose(), lat.transpose()

  plt.axes(ax)
  mp.drawcoastlines(linewidth=.25)
  mp.fillcontinents(color=[.95, .95, .95], lake_color=[.95, .95, .95], zorder=0)
 #mp.drawparallels(np.arange(-180, 180, 10), labels=[1,1])
 #mp.drawmeridians(np.arange(-90, 90, 10), labels=[1,1])
  pcl = mp.pcolor(lon, lat, relChngDiff*100, cmap=cmap)
  vmin = -vmax if vmin is None else vmin
  plt.clim(vmin, vmax)
  print('mean absolute change: ' + str(np.nanmean(np.abs(relChngDiff)*100)) + '%')

  txtpos = mp(-7, 25)
  plt.annotate(txt, xy=txtpos, xycoords='data', xytext=txtpos, textcoords='data', fontsize=13)

  return pcl, mp
Exemple #2
0
def plotPvalue(ax, pValue, relChngDiff, mp, txt):
    if mp == None:
        llcrnrlon = -11.5
        llcrnrlat = 23
        urcrnrlon = 44
        urcrnrlat = 74
        mp = bm.Basemap(llcrnrlon=llcrnrlon,
                        llcrnrlat=llcrnrlat,
                        urcrnrlon=urcrnrlon,
                        urcrnrlat=urcrnrlat,
                        resolution='l')

    lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
    lon, lat = lon.transpose(), lat.transpose()

    plt.axes(ax)
    mp.drawcoastlines(linewidth=.25)

    pvl_ = pValue.copy()
    pvl_[pvl_ > .5] = np.nan
    #pvl_[relChngDiff <= 0] = pvl_[relChngDiff <= 0] - 1
    #pvl_[relChngDiff > 0] = 1 - pvl_[relChngDiff > 0]
    #pcl = mp.pcolor(lon, lat, pvl_, cmap='Spectral')
    #pcl = mp.pcolor(lon, lat, pvl_, cmap='hot', vmin=0, vmax=.5)

    txtpos = mp(-7, 27)
    plt.annotate(txt,
                 xy=txtpos,
                 xycoords='data',
                 xytext=txtpos,
                 textcoords='data',
                 fontsize=13)

    return pcl, mp
Exemple #3
0
def plotSigma(ax, sigma, mp, txt, txt2='', sigmamax=30):
    if mp == None:
        #llcrnrlon = -11.5
        #llcrnrlat = 23
        #urcrnrlon = 44
        #urcrnrlat = 74
        llcrnrlon = -25
        llcrnrlat = 31
        urcrnrlon = 37
        urcrnrlat = 71.5
        mp = bm.Basemap(llcrnrlon=llcrnrlon,
                        llcrnrlat=llcrnrlat,
                        urcrnrlon=urcrnrlon,
                        urcrnrlat=urcrnrlat,
                        resolution='l',
                        projection='lcc',
                        lon_0=-15,
                        lat_1=-15,
                        lat_2=10)

    lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
    #lon, lat = lon.transpose(), lat.transpose()
    x, y = mp(lon, lat)

    plt.axes(ax)
    mp.drawcoastlines(linewidth=.25)
    mp.fillcontinents(color=[.95, .95, .95],
                      lake_color=[.95, .95, .95],
                      zorder=0)

    absSigma_ = np.abs(sigma)
    absSigma = bm.maskoceans(lon, lat, absSigma_)
    #pcl = mp.scatter(x.flatten(), y.flatten(), .07, c=absSigma.flatten(), cmap='Oranges', alpha=1, vmin=0, vmax=sigmamax)
    pcl = mp.pcolor(x,
                    y,
                    absSigma,
                    cmap='Oranges',
                    alpha=1,
                    vmin=0,
                    vmax=sigmamax)

    txtpos = mp(-21, 69.5)
    plt.annotate(txt,
                 xy=txtpos,
                 xycoords='data',
                 xytext=txtpos,
                 textcoords='data',
                 fontsize=13)

    if txt2 != '':
        txtpos = mp(-17, 67.5)
        plt.annotate(txt2,
                     xy=txtpos,
                     xycoords='data',
                     xytext=txtpos,
                     textcoords='data',
                     fontsize=14,
                     weight='bold')

    return pcl, mp
def plotSigma(ax, sigma, relChngDiff, mp, txt, sigmamax=30, signSigmaThreshold1=1, signSigmaThreshold2=2, prcTxtTmpl='', printSignTxt=True):
  if mp == None:
   #llcrnrlon = -11.5
   #llcrnrlat = 23
   #urcrnrlon = 44
   #urcrnrlat = 74
    llcrnrlon = -25
    llcrnrlat = 31
    urcrnrlon = 37
    urcrnrlat = 71.5
    mp = bm.Basemap(llcrnrlon=llcrnrlon, llcrnrlat=llcrnrlat, urcrnrlon=urcrnrlon, 
             urcrnrlat=urcrnrlat, resolution='l', projection='lcc', lon_0=-15, lat_1=-15, lat_2=10)

  lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
  lon, lat = lon.transpose(), lat.transpose()
  x, y = mp(lon, lat)

  plt.axes(ax)
  mp.drawcoastlines(linewidth=.25)
  mp.fillcontinents(color=[.95, .95, .95], lake_color=[.95, .95, .95], zorder=0)

  absSigma = np.abs(sigma)
 #pcl = mp.pcolor(lon, lat, sigma, cmap='hot_r', vmin=0, vmax=sigmamax)
 #pcl = mp.pcolor(lon, lat, sigma, cmap='Spectral_r', vmin=0, vmax=sigmamax)
 #pcl = mp.pcolor(lon, lat, sigma, cmap='coolwarm', vmin=0, vmax=sigmamax)
 #pcl = mp.pcolor(lon, lat, np.abs(sigma), cmap='RdBu_r', vmin=0, vmax=sigmamax)
 #pcl = mp.pcolor(lon, lat, absSigma, cmap='PuBu_r', vmin=0, vmax=sigmamax)
 #pcl = mp.scatter(lon.flatten(), lat.flatten(), .07, c=absSigma.flatten(), cmap='PuBu_r', alpha=1, vmin=0, vmax=sigmamax)
  pcl = mp.scatter(x.flatten(), y.flatten(), .07, c=absSigma.flatten(), cmap='Oranges', alpha=1, vmin=0, vmax=sigmamax)
 #prcTxtTmpl = '% of pixel where ${thr}\|\Delta Q_{{100-wl}}\| > \sigma_{{im}}$: {p:2.0f}%' if prcTxtTmpl == '' else prcTxtTmpl

  if prcTxtTmpl != '':
    sigma_ratio = sigma/np.abs(relChngDiff)
    percSign = float(np.nansum(sigma_ratio <= signSigmaThreshold1))/np.nansum(np.logical_not(np.isnan(sigma_ratio)))
    thrstr = '{thr:1.0f}'.format(thr=signSigmaThreshold1) if signSigmaThreshold1 != 1 else ''
    prcTxt1 = prcTxtTmpl.format(p=percSign*100, thr=thrstr)
    print(prcTxt1)
  
    percSign = float(np.nansum(sigma_ratio <= signSigmaThreshold2))/np.nansum(np.logical_not(np.isnan(sigma_ratio)))
    thrstr = '{thr:1.0f}\cdot'.format(thr=signSigmaThreshold2) if signSigmaThreshold2 != 1 else ''
    prcTxt2 = prcTxtTmpl.format(p=percSign*100, thr=thrstr)
    print(prcTxt2)
  
   #txtpos = mp(-7, 71)
    txtpos = mp(-24, 32) if printSignTxt else mp(-21, 69.5)
    plt.annotate(txt, xy=txtpos, xycoords='data', xytext=txtpos, textcoords='data', fontsize=13)
    if printSignTxt:
     #txtpos = mp(-8, 27)
      txtpos = mp(-24.3, 70.3)
      bb = {'boxstyle': 'square,pad=0', 'ec': 'none', 'fc': 'w'}
      plt.annotate(prcTxt1, xy=txtpos, xycoords='data', xytext=txtpos, textcoords='data', fontsize=10, bbox=bb)
     #txtpos = mp(-8, 24)
     #txtpos = mp(-24.3, 69.1)
     #plt.annotate(prcTxt2, xy=txtpos, xycoords='data', xytext=txtpos, textcoords='data', fontsize=10, bbox=bb)
  else:
    txtpos = mp(-24, 32)
    plt.annotate(txt, xy=txtpos, xycoords='data', xytext=txtpos, textcoords='data', fontsize=13)

  return pcl, mp
Exemple #5
0
def plotRelChngDiff(ax, relChngDiff, mp, txt, cmap='RdBu', vmax=20, vmin=None):
    if mp == None:
        #llcrnrlon = -11.5
        #llcrnrlat = 23
        #urcrnrlon = 44
        #urcrnrlat = 74
        llcrnrlon = -25
        llcrnrlat = 31
        urcrnrlon = 37
        urcrnrlat = 71.5
        mp = bm.Basemap(llcrnrlon=llcrnrlon,
                        llcrnrlat=llcrnrlat,
                        urcrnrlon=urcrnrlon,
                        urcrnrlat=urcrnrlat,
                        resolution='l',
                        projection='lcc',
                        lon_0=-15,
                        lat_1=-15,
                        lat_2=10)

    lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
    lon, lat = lon.transpose(), lat.transpose()
    x, y = mp(lon, lat)

    plt.axes(ax)
    mp.drawcoastlines(linewidth=.25)
    mp.fillcontinents(color=[.95, .95, .95],
                      lake_color=[.95, .95, .95],
                      zorder=0)
    #mp.drawparallels(np.arange(-180, 180, 10), labels=[1,1])
    #mp.drawmeridians(np.arange(-90, 90, 10), labels=[1,1])
    #pcl = mp.pcolor(lon, lat, relChngDiff*100, cmap=cmap)
    #pcl = mp.scatter(lon.flatten(), lat.flatten(), .07, c=relChngDiff.flatten()*100, cmap=cmap, alpha=1)
    pcl = plt.scatter(x.flatten(),
                      y.flatten(),
                      .07,
                      c=relChngDiff.flatten() * 100,
                      cmap=cmap,
                      alpha=1)
    vmin = -vmax if vmin is None else vmin
    plt.clim(vmin, vmax)
    print('mean absolute change: ' +
          str(np.nanmean(np.abs(relChngDiff) * 100)) + '%')

    txtpos = mp(-24, 32)
    #txtpos = mp(-22, 69)
    plt.annotate(txt,
                 xy=txtpos,
                 xycoords='data',
                 xytext=txtpos,
                 textcoords='data',
                 fontsize=13)

    return pcl, mp
def plotSigma(ax, sigma, relChngDiff, mp, txt, sigmamax=2, signSigmaThreshold1=1, signSigmaThreshold2=2, prcTxtTmpl='', printSignTxt=True):
  if mp == None:
    llcrnrlon = -11.5
    llcrnrlat = 23
    urcrnrlon = 44
    urcrnrlat = 74
    mp = bm.Basemap(llcrnrlon=llcrnrlon, llcrnrlat=llcrnrlat, urcrnrlon=urcrnrlon, 
             urcrnrlat=urcrnrlat, resolution='l')

  lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
  lon, lat = lon.transpose(), lat.transpose()

  plt.axes(ax)
  mp.drawcoastlines(linewidth=.25)
  mp.fillcontinents(color=[.8, .8, .8], lake_color=[.8, .8, .8], zorder=0)

  absSigma = np.abs(sigma)
 #pcl = mp.pcolor(lon, lat, sigma, cmap='hot_r', vmin=0, vmax=sigmamax)
 #pcl = mp.pcolor(lon, lat, sigma, cmap='Spectral_r', vmin=0, vmax=sigmamax)
 #pcl = mp.pcolor(lon, lat, sigma, cmap='coolwarm', vmin=0, vmax=sigmamax)
 #pcl = mp.pcolor(lon, lat, np.abs(sigma), cmap='RdBu_r', vmin=0, vmax=sigmamax)
 #pcl = mp.pcolor(lon, lat, absSigma, cmap='PuBu_r', vmin=0, vmax=sigmamax)
  x, y = mp(lon, lat)
 #sc = plt.scatter(x, y, s=1, c=absSigma, linewidth=0, cmap='PuBu_r')
  absSigma[absSigma > 1.75] = 1.75
  sc = plt.scatter(x, y, s=1, c=absSigma, linewidth=0, cmap='PuBu_r', vmax=sigmamax)
  prcTxtTmpl = '% of pixel where ${thr}\|\Delta d_{{100-wl}}\| > \sigma_{{im}}$: {p:2.2f}%' if prcTxtTmpl == '' else prcTxtTmpl

  percSign = float(np.nansum(absSigma <= signSigmaThreshold1))/np.nansum(np.logical_not(np.isnan(absSigma)))
  thrstr = '{thr:1.0f}'.format(thr=signSigmaThreshold1) if signSigmaThreshold1 != 1 else ''
  prcTxt1 = prcTxtTmpl.format(p=percSign*100, thr=thrstr)
  print(prcTxt1)

  percSign = float(np.nansum(absSigma <= signSigmaThreshold2))/np.nansum(np.logical_not(np.isnan(absSigma)))
  thrstr = '{thr:1.0f}\cdot'.format(thr=signSigmaThreshold2) if signSigmaThreshold2 != 1 else ''
  prcTxt2 = prcTxtTmpl.format(p=percSign*100, thr=thrstr)
  print(prcTxt2)

  txtpos = mp(-20, 69)
  plt.annotate(txt, xy=txtpos, xycoords='data', xytext=txtpos, textcoords='data', fontsize=13)
  if printSignTxt:
    txtpos = mp(-20, 27)
    plt.annotate(prcTxt1, xy=txtpos, xycoords='data', xytext=txtpos, textcoords='data', fontsize=10)

  return sc, mp
def plotPvalue(ax, pValue, relChngDiff, mp, txt):
    if mp == None:
        #llcrnrlon = -11.5
        #llcrnrlat = 23
        #urcrnrlon = 44
        #urcrnrlat = 74

        llcrnrlon = -25
        llcrnrlat = 25
        urcrnrlon = 44
        urcrnrlat = 71.5

        #mp = bm.Basemap(llcrnrlon=llcrnrlon, llcrnrlat=llcrnrlat, urcrnrlon=urcrnrlon,
        #         urcrnrlat=urcrnrlat, resolution='l')
        mp = bm.Basemap(llcrnrlon=llcrnrlon,
                        llcrnrlat=llcrnrlat,
                        urcrnrlon=urcrnrlon,
                        urcrnrlat=urcrnrlat,
                        resolution='l',
                        projection='lcc',
                        lon_0=-15,
                        lat_1=-15,
                        lat_2=10)

    lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
    lon, lat = lon.transpose(), lat.transpose()

    plt.axes(ax)
    mp.drawcoastlines(linewidth=.25)

    pvl_ = pValue.copy()
    pvl_[pvl_ > .5] = np.nan
    #pcl = mp.pcolor(lon, lat, pvl_, cmap='hot', vmin=0, vmax=.5)
    x, y = mp(lon, lat)
    sc = plt.scatter(x, y, s=1, c=pvl_, linewidth=0, cmap='hot')

    txtpos = mp(-7, 27)
    plt.annotate(txt,
                 xy=txtpos,
                 xycoords='data',
                 xytext=txtpos,
                 textcoords='data',
                 fontsize=13)

    return sc, mp
Exemple #8
0
def plotAgreeingMdlCnt(ax, agrMdlCnt, mp, txt):
  if mp == None:
    llcrnrlon = -11.5
    llcrnrlat = 23
    urcrnrlon = 44
    urcrnrlat = 74
    mp = bm.Basemap(llcrnrlon=llcrnrlon, llcrnrlat=llcrnrlat, urcrnrlon=urcrnrlon, 
             urcrnrlat=urcrnrlat, resolution='l')

  lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
  lon, lat = lon.transpose(), lat.transpose()

  plt.axes(ax)
  mp.drawcoastlines(linewidth=.25)
  mp.fillcontinents(color=[.8, .8, .8], lake_color=[.7, .95, .7])

  pcl = mp.pcolor(lon, lat, agrMdlCnt, cmap='hot_r', vmin=6, vmax=11)

  txtpos = mp(-7, 25)
  plt.annotate(txt, xy=txtpos, xycoords='data', xytext=txtpos, textcoords='data')

  return pcl, mp
Exemple #9
0
def plotPvalue(ax, pValue, mp, txt):
    if mp == None:
        llcrnrlon = -25
        llcrnrlat = 31
        urcrnrlon = 37
        urcrnrlat = 71.5
        mp = bm.Basemap(llcrnrlon=llcrnrlon,
                        llcrnrlat=llcrnrlat,
                        urcrnrlon=urcrnrlon,
                        urcrnrlat=urcrnrlat,
                        resolution='l',
                        projection='lcc',
                        lon_0=-15,
                        lat_1=-15,
                        lat_2=10)

    lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
    lon, lat = lon.transpose(), lat.transpose()
    x, y = mp(lon, lat)

    plt.axes(ax)
    mp.drawcoastlines(linewidth=.25)
    mp.fillcontinents(color=[.95, .95, .95],
                      lake_color=[.95, .95, .95],
                      zorder=0)

    cnd = ~np.isnan(pValue)
    x_ = x[cnd]
    y_ = y[cnd]
    pval_ = pValue[cnd]

    #cmap = 'autumn_r'
    #pcl = mp.scatter(x_, y_, .07, c=sgn_, cmap=cmap, alpha=1, vmin=0, vmax=1)

    signClr = 'red'
    cnd = pval_ <= .05
    prc = float(np.sum(cnd)) / len(cnd) * 100.
    scSgn = mp.scatter(
        x_[cnd],
        y_[cnd],
        .07,
        c=signClr,
        alpha=1,
        label='p-value $\leq$ 0.05 ({prc:1.1f}% of pts)'.format(prc=prc))

    nonSignClr = 'lightgreen'
    cnd = pval_ > .05
    scNonSgn = mp.scatter(x_[cnd],
                          y_[cnd],
                          .07,
                          c=nonSignClr,
                          alpha=1,
                          label='p-value $>$ 0.05')

    #txtpos = mp(-21, 69.5)
    txtpos = mp(-21, 32)
    plt.annotate(txt,
                 xy=txtpos,
                 xycoords='data',
                 xytext=txtpos,
                 textcoords='data',
                 fontsize=13)

    plt.legend(markerscale=10, loc='upper left', fontsize=9)

    return scNonSgn, scSgn, mp
Exemple #10
0
def plotPvalue(ax, pValue, mp, txt):
    if mp == None:
        llcrnrlon = -25
        llcrnrlat = 31
        urcrnrlon = 37
        urcrnrlat = 71.5
        mp = bm.Basemap(llcrnrlon=llcrnrlon,
                        llcrnrlat=llcrnrlat,
                        urcrnrlon=urcrnrlon,
                        urcrnrlat=urcrnrlat,
                        resolution='l',
                        projection='lcc',
                        lon_0=-15,
                        lat_1=-15,
                        lat_2=10)

    lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
    #lon, lat = lon.transpose(), lat.transpose()
    x, y = mp(lon, lat)

    plt.axes(ax)
    mp.drawcoastlines(linewidth=.25)
    mp.fillcontinents(color=[.95, .95, .95],
                      lake_color=[.95, .95, .95],
                      zorder=0)

    sgn_ = np.ones(pValue.shape)
    sgn_[pValue <= .05] = 0
    sgn_[np.isnan(pValue)] = np.nan

    sgn = bm.maskoceans(lon, lat, sgn_)

    cmap = colors.LinearSegmentedColormap.from_list(
        'pvalue', ['red', 'white', 'lightgreen'], N=256)
    pcl = mp.pcolor(x, y, sgn, cmap=cmap, alpha=1)

    signClr = 'red'
    scSgn = mp.scatter(1e6,
                       1e6,
                       .07,
                       c=signClr,
                       alpha=1,
                       label='p-value $\leq$ 0.05')

    nonSignClr = 'lightgreen'
    scNonSgn = mp.scatter(1e6,
                          1e6,
                          .07,
                          c=nonSignClr,
                          alpha=1,
                          label='p-value $>$ 0.05')

    #txtpos = mp(-21, 69.5)
    txtpos = mp(-21, 32)
    plt.annotate(txt,
                 xy=txtpos,
                 xycoords='data',
                 xytext=txtpos,
                 textcoords='data',
                 fontsize=13)

    plt.legend(markerscale=10, loc='upper left', fontsize=9)

    return scNonSgn, scSgn, mp
def plotRelChngDiff(ax, relChngDiff, sigma, mp, txt, cmap='RdBu', vmax=20, vmin=None):
  if mp == None:
   #llcrnrlon = -11.5
   #llcrnrlat = 23
   #urcrnrlon = 44
   #urcrnrlat = 74
    llcrnrlon = -25
    llcrnrlat = 31
    urcrnrlon = 37
    urcrnrlat = 71.5
    mp = bm.Basemap(llcrnrlon=llcrnrlon, llcrnrlat=llcrnrlat, urcrnrlon=urcrnrlon, 
             urcrnrlat=urcrnrlat, resolution='l', projection='lcc', lon_0=-15, lat_1=-15, lat_2=10)

  lon, lat = estimateChngSignificanceAndRobustness.getLonLat()
  lon, lat = lon.transpose(), lat.transpose()
  x, y = mp(lon, lat)

  plt.axes(ax)
  mp.drawcoastlines(linewidth=.25)
  mp.fillcontinents(color=[.95, .95, .95], lake_color=[.95, .95, .95], zorder=0)
 #mp.drawparallels(np.arange(-180, 180, 10), labels=[1,1])
 #mp.drawmeridians(np.arange(-90, 90, 10), labels=[1,1])
 #pcl = mp.pcolor(lon, lat, relChngDiff*100, cmap=cmap)
 #pcl = mp.scatter(lon.flatten(), lat.flatten(), .07, c=relChngDiff.flatten()*100, cmap=cmap, alpha=1)

  cnd = ~np.isnan(relChngDiff)
 #xFt = x[cnd]
 #yFt = y[cnd]
  lonFt = lon[cnd]
  latFt = lat[cnd]
  rlChngDiffFt = relChngDiff[cnd]
  sgmFt = sigma[cnd]
  chSigmaRatio = np.abs(rlChngDiffFt)/sgmFt
 #xgrd, ygrd = np.meshgrid(np.linspace(min(xFt), max(xFt), 150), np.linspace(min(yFt), max(yFt), 150))
  longrd, latgrd = np.meshgrid(np.linspace(min(lonFt), max(lonFt), 150), np.linspace(min(latFt), max(latFt), 150))
  chSigmaRatioMap = griddata((lonFt, latFt), chSigmaRatio, (longrd, latgrd))
  xgrd, ygrd = mp(longrd, latgrd)
  xFt, yFt = mp(lonFt, latFt)
  signMap = chSigmaRatioMap >= 1
  signMap = bm.maskoceans(longrd, latgrd, signMap)
  mskEast = np.logical_and(latgrd <= 66.47, longrd >= 34.88)
  mskTrk0 = np.logical_and( np.logical_and(36. <= latgrd, latgrd <= 39.13), longrd >= 26.17)
  mskTrk1 = np.logical_and( np.logical_and(39.13 <= latgrd, latgrd <= 42.57), longrd >= 31)
  mskNAfrica = np.logical_and( np.logical_and(-1 <= longrd, longrd <= 11.55), latgrd <= 36.66)
  signMap[mskEast] = False
  signMap[mskTrk0] = False
  signMap[mskTrk1] = False
  signMap[mskNAfrica] = False
  
  pcl = plt.scatter(xFt, yFt, .07, c=rlChngDiffFt*100, cmap=cmap, alpha=1)
  vmin = -vmax if vmin is None else vmin
  plt.clim(vmin, vmax)
 #htch = plt.contourf(xgrd, ygrd, signMap, 3, hatches=['', '\\\\\\\\\\'], alpha=0)
  mpl.rcParams['hatch.linewidth'] = 0.5
  htch = plt.contourf(xgrd, ygrd, signMap, 3, hatches=['', '\\\\\\'], alpha=0, linewidth=.2)
  print('mean absolute change: ' + str(np.nanmean(np.abs(relChngDiff)*100)) + '%')

  txtpos = mp(-24, 32)
 #txtpos = mp(-22, 69)
  plt.annotate(txt, xy=txtpos, xycoords='data', xytext=txtpos, textcoords='data', fontsize=13)

  return pcl, mp