Esempio n. 1
0
ax.set_ylim(-4.0, 0.0)
# ax.set_xlim(dt[0], dt[-1]) # first to last regardless of what
ax.set_xlim(date2num(dt[-1]) - 30, date2num(dt[-1]))  # last minus 30 days to last
ax.xaxis.set_major_locator(DayLocator(range(2, 32, 2)))
ax.xaxis.set_minor_locator(HourLocator(range(0, 25, 12)))
ax.set_xticklabels([])

# this only moves the label not the tick labels
ax.xaxis.set_label_position("top")
ax.set_xlabel("Stones Bay AVP -- Last 30 days from " + last_dt_str)

# right-hand side scale
ax2 = twinx(ax)
ax2.yaxis.tick_right()
# convert (lhs) meters to (rhs) feet
feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
ax2.set_ylim(feet)
ax2.set_ylabel("Depth (ft)")

# legend
# ls1 = l1.get_label()
# leg = ax.legend((l1,), (ls1,), loc='upper left')
# ltext  = leg.get_texts()  # all the text.Text instance in the legend
# llines = leg.get_lines()  # all the lines.Line2D instance in the legend
# frame  = leg.get_frame()  # the patch.Rectangle instance surrounding the legend
# frame.set_facecolor('0.80')      # set the frame face color to light gray
# frame.set_alpha(0.5)             # set alpha low to see through
# setp(ltext, fontsize='small')    # the legend text fontsize
# setp(llines, linewidth=1.5)      # the legend linewidth
# leg.draw_frame(False)           # don't draw the legend frame
def wind_barbs(pi, si, yyyy_mm, plot_type='latest'):
    print 'billymitchell_arrows_plot ...'

    #

    prev_month, this_month, next_month = procutil.find_months(yyyy_mm)
    yyyy_mm_str = this_month.strftime('%Y_%m')

    ################################
    # [2a] load primary data file
    ################################

    ncFile1='/seacoos/data/nccoos/level2/billymitchell/sodar1/billymitchell_sfas_'+prev_month.strftime('%Y_%m')+'.nc'
    ncFile2='/seacoos/data/nccoos/level2/billymitchell/sodar1/billymitchell_sfas_'+this_month.strftime('%Y_%m')+'.nc'

    have_ncFile1 = os.path.exists(ncFile1)
    have_ncFile2 = os.path.exists(ncFile2)

    print ' ... loading data for graph from ...'
    print ' ... ... ' + ncFile1 + ' ... ' + str(have_ncFile1)
    print ' ... ... ' + ncFile2 + ' ... ' + str(have_ncFile2)

    # open netcdf data
    if have_ncFile1 and have_ncFile2:
        try:
            nc = pycdf.CDFMF((ncFile1, ncFile2))
        except: # files may have different dimensions
            nc = pycdf.CDFMF((ncFile2,))
    elif not have_ncFile1 and have_ncFile2:
        nc = pycdf.CDFMF((ncFile2,))
    elif have_ncFile1 and not have_ncFile2:
        nc = pycdf.CDFMF((ncFile1,))
    else:
        print ' ... both files do not exist -- NO DATA LOADED'
        return

    # ncvars = nc.variables()
    # print ncvars
    es = nc.var('time')[:]
    units = nc.var('time').units
    dt = [procutil.es2dt(e) for e in es]
    # set timezone info to UTC (since data from level2 should be in UTC!!)
    dt = [e.replace(tzinfo=dateutil.tz.tzutc()) for e in dt]
    # return new datetime based on computer local
    dt_local = [e.astimezone(dateutil.tz.tzlocal()) for e in dt]
    dn = date2num(dt)


    ################################
    # [2b] specify variables 
    ################################
    z = nc.var('z')[:]
    # convert cm/s to m/s
    uu = nc.var('u')[:]
    vv = nc.var('v')[:]
    ww = nc.var('w')[:]
    sigw = nc.var('sigw')[:]
    echo = nc.var('bck')[:]

    nc.close()

    # retain original dt for addnan
    dto = dt

    # last dt in data for labels
    dtu = dt[-1]
    dtl = dt_local[-1]

    diff = abs(dtu - dtl)
    if diff.days>0:
        last_dt_str = dtu.strftime("%H:%M %Z on %b %d, %Y") + ' (' + dtl.strftime("%H:%M %Z, %b %d") + ')'
    else:
        last_dt_str = dtu.strftime("%H:%M %Z") + ' (' + dtl.strftime("%H:%M %Z") + ')' \
                      + dtl.strftime(" on %b %d, %Y")

    #######################################
    # Plot setup
    #######################################

    fig = figure(figsize=(10, 10))
    fig.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.1, hspace=0.1)

    ax = fig.add_subplot(1,1,1)
    axs = [ax]

    # range for horizontal wind plots
    # cmin, cmax = (0., 20.)
    # print "%s : %g %g" % ('uv wind', cmin, cmax)
    # use masked array to hide NaN's on plot
    (dt, uu) = procutil.addnan(dto, uu)
    dn = date2num(dt)
    um = numpy.ma.masked_where(numpy.isnan(uu), uu)

    (dt, vv) = procutil.addnan(dto, vv)
    vm = numpy.ma.masked_where(numpy.isnan(vv), vv)
    wspd = numpy.sqrt(um*um + vm*vm)

    X,Y = numpy.meshgrid(dn, z)

    q1 = ax.barbs(X, Y, um.T, vm.T, wspd.T)
    # qk = ax.quiverkey(q1, 0.1, 0.8, 20, r'20 m s-1')
    
    ax.set_ylabel('Height (m)')

    # setup colorbar axes instance.
    l,b,w,h = ax.get_position().bounds
    cax = fig.add_axes([l+0.02, b+h-0.06, 0.25*w, 0.03])

    cb = colorbar(q1, cax=cax, orientation='horizontal') # draw colorbar
    cb.set_label('Wind Velocity (m s-1)')

    # lost control of colorbar ... ???
    # 
    # cb.ax.xaxis.set_label_position('top')
    # cb.ax.set_xticks([0.0, 0.5, 1.0])
    # xtl = numpy.round(numpy.linspace(cmin, cmax, 11), decimals=0)
    # cb.ax.set_xticklabels([xtl[0], xtl[5], xtl[10]])

    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1))) 
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.set_xticklabels([])

    # this only moves the label not the tick labels
    ax.xaxis.set_label_position('bottom')
    ax.set_xlabel('BILLY MITCHELL Wind Profile -- ' + yyyy_mm_str)

    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Height (ft)')

    

    #######################################
    # Last 1 day (24hrs)
    #######################################
    if plot_type=='latest':
        print ' ... Last 1 days'

        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-1, date2num(dt[-1]))
            ax.xaxis.set_major_locator( HourLocator(range(0,25,1)) )
            ax.xaxis.set_minor_locator( MinuteLocator(range(0,61,30)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BILLY MITCHELL Wind Profile -- Last 24 hours from ' + last_dt_str)
            if idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%H') )
                ax.set_xlabel('BILLY MITCHELL Wind Profile -- Last 24 hours from ' + last_dt_str)

        savefig('/home/haines/rayleigh/img/billymitchell_windbarbs_last01days.png')
Esempio n. 3
0
def timeseries(pi, si, yyyy_mm, plot_type='latest'):
    """ 
    """


    print 'bogue_adcp_plot ...'

    #

    prev_month, this_month, next_month = procutil.find_months(yyyy_mm)
    yyyy_mm_str = this_month.strftime('%Y_%m')

    ################################
    # [2a] load primary data file
    ################################

    ncFile1='/seacoos/data/nccoos/level1/bogue/adcp/bogue_adcp_'+prev_month.strftime('%Y_%m')+'.nc'
    ncFile2='/seacoos/data/nccoos/level1/bogue/adcp/bogue_adcp_'+this_month.strftime('%Y_%m')+'.nc'

    have_ncFile1 = os.path.exists(ncFile1)
    have_ncFile2 = os.path.exists(ncFile2)

    print ' ... loading data for graph from ...'
    print ' ... ... ' + ncFile1 + ' ... ' + str(have_ncFile1)
    print ' ... ... ' + ncFile2 + ' ... ' + str(have_ncFile2)

    # open netcdf data
    if have_ncFile1 and have_ncFile2:
        nc = pycdf.CDFMF((ncFile1, ncFile2))
    elif not have_ncFile1 and have_ncFile2:
        nc = pycdf.CDFMF((ncFile2,))
    elif have_ncFile1 and not have_ncFile2:
        nc = pycdf.CDFMF((ncFile1,))
    else:
        print ' ... both files do not exist -- NO DATA LOADED'
        return

    # ncvars = nc.variables()
    # print ncvars
    es = nc.var('time')[:]
    units = nc.var('time').units
    dt = [procutil.es2dt(e) for e in es]
    # set timezone info to UTC (since data from level1 should be in UTC!!)
    dt = [e.replace(tzinfo=dateutil.tz.tzutc()) for e in dt]
    # return new datetime based on computer local
    dt_local = [e.astimezone(dateutil.tz.tzlocal()) for e in dt]
    dn = date2num(dt)

    ################################
    # [2b] specify variables 
    ################################
    z = nc.var('z')[:]
    wd = nc.var('wd')[:]
    wl = nc.var('wl')[:]
    # en = nc.var('en')[:]
    u = nc.var('u')[:]
    v = nc.var('v')[:]
    e1 = nc.var('e1')[:]

    nc.close()

    # last dt in data for labels
    dtu = dt[-1]
    dtl = dt_local[-1]

    diff = abs(dtu - dtl)
    if diff.days>0:
        last_dt_str = dtu.strftime("%H:%M %Z on %b %d, %Y") + ' (' + dtl.strftime("%H:%M %Z, %b %d") + ')'
    else:
        last_dt_str = dtu.strftime("%H:%M %Z") + ' (' + dtl.strftime("%H:%M %Z") + ')' \
                      + dtl.strftime(" on %b %d, %Y")

    #######################################
    # Plot setup
    #######################################
    # range for pcolor plots
    cmin, cmax = (-0.5, 0.5)

    fig = figure(figsize=(10, 8))
    fig.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.1, hspace=0.1)

    ax = fig.add_subplot(4,1,1)
    axs = [ax]

    # replace gaps in time with NaN
    (x, y) = procutil.addnan(dt, u, maxdelta=2./24)
    dnx = date2num(x)
    # use masked array to hide NaN's on plot
    um = numpy.ma.masked_where(numpy.isnan(y), y)
    pc = ax.pcolor(dnx, z, um.T, vmin=cmin, vmax=cmax)
    pc.set_label('True Eastward Current (m s-1)')
    ax.text(0.025, 0.1, pc.get_label(), fontsize="small", transform=ax.transAxes)

    # setup colorbar axes instance
    l,b,w,h = ax.get_position().bounds
    cax = fig.add_axes([l, b+h+0.04, 0.25*w, 0.03])

    cb = colorbar(pc, cax=cax, orientation='horizontal') # draw colorbar
    cb.set_label('Current Velocity (m s-1)')
    cb.ax.xaxis.set_label_position('top')
    cb.ax.set_xticks([0.1, 0.3, 0.5, 0.7, 0.9])
    cb.ax.set_xticklabels([-0.4, -0.2, 0, 0.2, 0.4])

    # ax.plot returns a list of lines, so unpack tuple
    (x, y) = procutil.addnan(dt, wl, maxdelta=2./24)
    l1, = ax.plot_date(x, y, fmt='k-')
    l1.set_label('Water Level')

    ax.set_ylabel('Depth (m)')
    ax.set_ylim(-10., 2.)
    # ax.set_xlim(dt[0], dt[-1]) # first to last regardless of what  
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.set_xticklabels([])

    # this only moves the label not the tick labels
    ax.xaxis.set_label_position('top')
    ax.set_xlabel('BOGUE Current Profile -- ' + yyyy_mm_str)

    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Depth (ft)')

    ax2.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax2.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax2.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax2.set_xticklabels([])

    # legend
    ls1 = l1.get_label()
    leg = ax.legend((l1,), (ls1,), loc='upper left')
    ltext  = leg.get_texts()  # all the text.Text instance in the legend
    llines = leg.get_lines()  # all the lines.Line2D instance in the legend
    frame  = leg.get_frame()  # the patch.Rectangle instance surrounding the legend
    frame.set_facecolor('0.80')      # set the frame face color to light gray
    frame.set_alpha(0.5)             # set alpha low to see through
    setp(ltext, fontsize='small')    # the legend text fontsize
    setp(llines, linewidth=1.5)      # the legend linewidth
    # leg.draw_frame(False)           # don't draw the legend frame

    #######################################
    #
    ax = fig.add_subplot(4,1,2)
    axs.append(ax)

    # replace gaps in time with NaN
    (x, y) = procutil.addnan(dt, v, maxdelta=2./24)
    dnx = date2num(x)
    # use masked array to hide NaN's on plot
    vm = numpy.ma.masked_where(numpy.isnan(y), y)
    # (x, y) = procutil.addnan(dt, vm, maxdelta=2./24)
    pc = ax.pcolor(dnx, z, vm.T, vmin=cmin, vmax=cmax)
    pc.set_label('True Northward Current (m s-1)')
    ax.text(0.025, 0.1, pc.get_label(), fontsize="small", transform=ax.transAxes)

    # ax.plot returns a list of lines, so unpack tuple
    (x, y) = procutil.addnan(dt, wl, maxdelta=2./24)
    l1, = ax.plot_date(x, y, fmt='k-')
    l1.set_label('Water Level')

    ax.set_ylabel('Depth (m)')
    ax.set_ylim(-10.,2.)
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )

    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Depth (ft)')

    ax2.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax2.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax2.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )

    # legend
    ls1 = l1.get_label()
    leg = ax.legend((l1,), (ls1,), loc='upper left')
    ltext  = leg.get_texts()  # all the text.Text instance in the legend
    llines = leg.get_lines()  # all the lines.Line2D instance in the legend
    frame  = leg.get_frame()  # the patch.Rectangle instance surrounding the legend
    frame.set_facecolor('0.80')      # set the frame face color to light gray
    frame.set_alpha(0.5)             # set alpha low to see through
    setp(ltext, fontsize='small')    # the legend text fontsize
    setp(llines, linewidth=1.5)      # the legend linewidth
    # leg.draw_frame(False)           # don't draw the legend frame

    #######################################
    #
    ax = fig.add_subplot(4,1,3)
    axs.append(ax)

    # replace gaps in time with NaN
    (x, y) = procutil.addnan(dt, e1, maxdelta=2./24)
    dnx = date2num(x)
    # use masked array to hide NaN's on plot
    vm = numpy.ma.masked_where(numpy.isnan(y), y)
    # (x, y) = procutil.addnan(dt, vm, maxdelta=2./24)
    pc = ax.pcolor(dnx, z, vm.T, vmin=0., vmax=150.)
    pc.set_label('Amplitude Beam 1 (count)')
    ax.text(0.025, 0.1, pc.get_label(), fontsize="small", transform=ax.transAxes)

    # ax.plot returns a list of lines, so unpack tuple
    (x, y) = procutil.addnan(dt, wl, maxdelta=2./24)
    l1, = ax.plot_date(x, y, fmt='k-')
    l1.set_label('Water Level')

    ax.set_ylabel('Depth (m)')
    ax.set_ylim(-10.,2.)
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )

    ax.set_xlabel('BOGUE Current Profile -- ' + yyyy_mm_str)

    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Depth (ft)')

    ax2.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax2.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax2.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax2.xaxis.set_major_formatter( DateFormatter('%m/%d') )

    # legend
    ls1 = l1.get_label()
    leg = ax.legend((l1,), (ls1,), loc='upper left')
    ltext  = leg.get_texts()  # all the text.Text instance in the legend
    llines = leg.get_lines()  # all the lines.Line2D instance in the legend
    frame  = leg.get_frame()  # the patch.Rectangle instance surrounding the legend
    frame.set_facecolor('0.80')      # set the frame face color to light gray
    frame.set_alpha(0.5)             # set alpha low to see through
    setp(ltext, fontsize='small')    # the legend text fontsize
    setp(llines, linewidth=1.5)      # the legend linewidth
    # leg.draw_frame(False)           # don't draw the legend frame


    # save figure for this month
    ofn = '/home/haines/rayleigh/img/bogue/bogue_adcp_'+yyyy_mm_str+'.png'
    print '... ... write: %s' % (ofn,)
    savefig(ofn)


    #######################################
    # Last 30 days
    #######################################
    if plot_type=='latest':
        print ' ... Last 30 days'
        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-30, date2num(dt[-1]))
            ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
            ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BOGUE Current Profiles -- Last 30 days from ' + last_dt_str)
            elif idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
                ax.set_xlabel('BOGUE Current Profiles -- Last 30 days from ' + last_dt_str)

        savefig('/home/haines/rayleigh/img/bogue_adcp_last30days.png')


    #######################################
    # Last 7 days
    #######################################
    if plot_type=='latest':
        print ' ... Last 7 days'
        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-7, date2num(dt[-1]))
            ax.xaxis.set_major_locator( DayLocator(range(0,32,1)) )
            ax.xaxis.set_minor_locator( HourLocator(range(0,25,6)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BOGUE Current Profiles -- Last 7 days from ' + last_dt_str)
            elif idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
                ax.set_xlabel('BOGUE Current Profiles -- Last 7 days from ' + last_dt_str)
                
        savefig('/home/haines/rayleigh/img/bogue_adcp_last07days.png')


    #######################################
    # Last 1 day (24hrs)
    #######################################
    if plot_type=='latest':
        print ' ... Last 1 days'

        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-1, date2num(dt[-1]))
            ax.xaxis.set_major_locator( HourLocator(range(0,25,1)) )
            ax.xaxis.set_minor_locator( MinuteLocator(range(0,61,30)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BOGUE Current Profiles -- Last 24 hours from ' + last_dt_str)
            elif idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%H') )
                ax.set_xlabel('BOGUE Current Profiles -- Last 24 hours from ' + last_dt_str)

        savefig('/home/haines/rayleigh/img/bogue_adcp_last01days.png')
def timeseries(pi, si, yyyy_mm, plot_type='latest'):
    print 'billymitchell_sodar1_plot ...'

    #

    prev_month, this_month, next_month = procutil.find_months(yyyy_mm)
    yyyy_mm_str = this_month.strftime('%Y_%m')

    ################################
    # [2a] load primary data file
    ################################

    ncFile1='/seacoos/data/nccoos/level2/billymitchell/sodar1/billymitchell_sfas_'+prev_month.strftime('%Y_%m')+'.nc'
    ncFile2='/seacoos/data/nccoos/level2/billymitchell/sodar1/billymitchell_sfas_'+this_month.strftime('%Y_%m')+'.nc'

    have_ncFile1 = os.path.exists(ncFile1)
    have_ncFile2 = os.path.exists(ncFile2)

    print ' ... loading data for graph from ...'
    print ' ... ... ' + ncFile1 + ' ... ' + str(have_ncFile1)
    print ' ... ... ' + ncFile2 + ' ... ' + str(have_ncFile2)

    # open netcdf data
    if have_ncFile1 and have_ncFile2:
        try:
            nc = pycdf.CDFMF((ncFile1, ncFile2))
        except: # files may have different dimensions
            nc = pycdf.CDFMF((ncFile2,))
    elif not have_ncFile1 and have_ncFile2:
        nc = pycdf.CDFMF((ncFile2,))
    elif have_ncFile1 and not have_ncFile2:
        nc = pycdf.CDFMF((ncFile1,))
    else:
        print ' ... both files do not exist -- NO DATA LOADED'
        return

    # ncvars = nc.variables()
    # print ncvars
    es = nc.var('time')[:]
    units = nc.var('time').units
    dt = [procutil.es2dt(e) for e in es]
    # set timezone info to UTC (since data from level2 should be in UTC!!)
    dt = [e.replace(tzinfo=dateutil.tz.tzutc()) for e in dt]
    # return new datetime based on computer local
    dt_local = [e.astimezone(dateutil.tz.tzlocal()) for e in dt]
    dn = date2num(dt)


    ################################
    # [2b] specify variables 
    ################################
    z = nc.var('z')[:]
    # convert cm/s to m/s
    uu = nc.var('u')[:]
    vv = nc.var('v')[:]
    ww = nc.var('w')[:]
    sigw = nc.var('sigw')[:]
    echo = nc.var('bck')[:]

    nc.close()

    # retain original dt for addnan
    dto = dt

    # last dt in data for labels
    dtu = dt[-1]
    dtl = dt_local[-1]

    diff = abs(dtu - dtl)
    if diff.days>0:
        last_dt_str = dtu.strftime("%H:%M %Z on %b %d, %Y") + ' (' + dtl.strftime("%H:%M %Z, %b %d") + ')'
    else:
        last_dt_str = dtu.strftime("%H:%M %Z") + ' (' + dtl.strftime("%H:%M %Z") + ')' \
                      + dtl.strftime(" on %b %d, %Y")

    #######################################
    # Plot setup
    #######################################

    fig = figure(figsize=(10, 10))
    fig.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.1, hspace=0.1)

    ax = fig.add_subplot(5,1,1)
    axs = [ax]

    # range for horizontal wind plots
    cmin, cmax = (-20., 20.)
    # print "%s : %g %g" % ('uv wind', cmin, cmax)
    # use masked array to hide NaN's on plot
    (dt, uu) = procutil.addnan(dto, uu)
    dn = date2num(dt)
    um = numpy.ma.masked_where(numpy.isnan(uu), uu)
    pc = ax.pcolor(dn, z, um.T, vmin=cmin, vmax=cmax)
    pc.set_label('True Eastward Wind (m s-1)')
    ax.text(0.025, 0.1, pc.get_label(), fontsize="small", transform=ax.transAxes)
    ax.set_ylabel('Height (m)')

    # setup colorbar axes instance.
    l,b,w,h = ax.get_position().bounds
    cax = fig.add_axes([l, b+h+0.04, 0.25*w, 0.03])

    cb = colorbar(pc, cax=cax, orientation='horizontal') # draw colorbar
    cb.set_label('Wind Velocity (m s-1)')
    cb.ax.xaxis.set_label_position('top')
    cb.ax.set_xticks([0.1, 0.3, 0.5, 0.7, 0.9])
    xtl = numpy.round(numpy.linspace(cmin, cmax, 10), decimals=0)
    cb.ax.set_xticklabels([xtl[1], xtl[3], xtl[5], xtl[7], xtl[9]])

    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1))) 
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.set_xticklabels([])

    # this only moves the label not the tick labels
    ax.xaxis.set_label_position('top')
    ax.set_xlabel('BILLY MITCHELL SODAR -- ' + yyyy_mm_str)

    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Height (ft)')

    #######################################
    #
    ax = fig.add_subplot(5,1,2)
    axs.append(ax)

    # use masked array to hide NaN's on plot
    (dt, vv) = procutil.addnan(dto, vv)
    dn = date2num(dt)
    vm = numpy.ma.masked_where(numpy.isnan(vv), vv)
    pc = ax.pcolor(dn, z, vm.T, vmin=cmin, vmax=cmax)
    pc.set_label('True Northward Wind (m s-1)')
    ax.text(0.025, 0.1, pc.get_label(), fontsize="small", transform=ax.transAxes)
    ax.set_ylabel('Height (m)')

    # ax.set_xlim(date2num(dt[0]), date2num(dt[-1])) 
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1))) 
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
    ax.set_xticklabels([])

    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Height (ft)')
    
    #######################################
    #
    ax = fig.add_subplot(5,1,3)
    axs.append(ax)
    
    # range for horizontal wind plots
    cmin, cmax = (-2., 2.)
    # print "%s : %g %g" % ('w wind', cmin, cmax)

    # use masked array to hide NaN's on plot
    (dt, ww) = procutil.addnan(dto, ww)
    dn = date2num(dt)
    wm = numpy.ma.masked_where(numpy.isnan(ww), ww)
    pc = ax.pcolor(dn, z, wm.T, vmin=cmin, vmax=cmax)
    ax.set_ylabel('Height (m)')
    
    # setup colorbar axes instance.
    l,b,w,h = ax.get_position().bounds
    cax = fig.add_axes([l+0.04, b+h-0.06, 0.25*w, 0.03])

    cb = colorbar(pc, cax=cax, orientation='horizontal') # draw colorbar
    cb.set_label('Upward Wind Velocity (m s-1)')
    cb.ax.xaxis.set_label_position('top')
    cb.ax.set_xticks([0.1, 0.3, 0.5, 0.7, 0.9])
    xtl = numpy.round(numpy.linspace(cmin, cmax, 10), decimals=0)
    cb.ax.set_xticklabels([xtl[1], xtl[3], xtl[5], xtl[7], xtl[9]])

    # ax.set_xlim(date2num(dt[0]), date2num(dt[-1])) 
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1))) 
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
    ax.set_xticklabels([])
    
    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Height (ft)')
    
    #######################################
    #
    ax = fig.add_subplot(5,1,4)
    axs.append(ax)
    
    cmin, cmax = (0., 2.)
    # print "%s : %g %g" % ('sigw', cmin, cmax)

    # use masked array to hide NaN's on plot
    (dt, sigw) = procutil.addnan(dto, sigw)
    dn = date2num(dt)
    sm = numpy.ma.masked_where(numpy.isnan(sigw), sigw)
    pc = ax.pcolor(dn, z, sm.T, vmin=cmin, vmax=cmax)
    ax.set_ylabel('Height (m)')

    # setup colorbar axes instance.
    l,b,w,h = ax.get_position().bounds
    cax = fig.add_axes([l+0.04, b+h-0.06, 0.25*w, 0.03])

    cb = colorbar(pc, cax=cax, orientation='horizontal') # draw colorbar
    cb.set_label('Std. Dev. of Vertical Wind (m s-1)')
    cb.ax.xaxis.set_label_position('top')
    cb.ax.set_xticks([0.0, 0.2, 0.4, 0.6, 0.8])
    xtl = numpy.round(numpy.linspace(cmin, cmax, 10), decimals=1)
    cb.ax.set_xticklabels([xtl[0], xtl[2], xtl[4], xtl[6], xtl[8]])
    
    # ax.set_xlim(date2num(dt[0]), date2num(dt[-1])) 
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1))) 
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
    ax.set_xticklabels([])
    
    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Height (ft)')

    #######################################
    #
    ax = fig.add_subplot(5,1,5)
    axs.append(ax)

    
    # cmin, cmax = (0., 1000.)
    cmin, cmax = (2., 6.)
    # print "%s : %g %g" % ('echo', cmin, cmax)

    # use masked array to hide NaN's on plot
    (dt, echo) = procutil.addnan(dto, numpy.log10(echo))
    dn = date2num(dt)
    em = numpy.ma.masked_where(numpy.isnan(echo), echo)
    pc = ax.pcolor(dn, z, em.T, vmin=cmin, vmax=cmax)
    ax.set_ylabel('Height (m)')

    # setup colorbar axes instance.
    l,b,w,h = ax.get_position().bounds
    cax = fig.add_axes([l+0.04, b+h-0.06, 0.25*w, 0.03])

    cb = colorbar(pc, cax=cax, orientation='horizontal') # draw colorbar
    cb.set_label('log10 Backscatter')
    cb.ax.xaxis.set_label_position('top')
    cb.ax.set_xticks([0.0, 1.0])
    xtl = numpy.round(numpy.linspace(cmin, cmax, 10), decimals=0)
    cb.ax.set_xticklabels([str(cmin), str(cmax)])
    
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1))) 
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
    ax.set_xticklabels([])
    
    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Height (ft)')

    ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
    ax.set_xlabel('BILLY MITCHELL SODAR -- ' + yyyy_mm_str)
    # save figure
    
    # save figure for this month
    ofn = '/home/haines/rayleigh/img/billymitchell/billymitchell_sodar1_'+yyyy_mm_str+'.png'
    print '... ... write: %s' % (ofn,)
    savefig(ofn)


    #######################################
    # Last 30 days
    #######################################
    if plot_type=='latest':
        print ' ... Last 30 days'
        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-30, date2num(dt[-1]))
            ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
            ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BILLY MITCHELL SODAR -- Last 30 days from ' + last_dt_str)
            elif idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
                ax.set_xlabel('BILLY MITCHELL SODAR -- Last 30 days from ' + last_dt_str)

        savefig('/home/haines/rayleigh/img/billymitchell_sodar1_last30days.png')


    #######################################
    # Last 7 days
    #######################################
    if plot_type=='latest':
        print ' ... Last 7 days'
        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-7, date2num(dt[-1]))
            ax.xaxis.set_major_locator( DayLocator(range(0,32,1)) )
            ax.xaxis.set_minor_locator( HourLocator(range(0,25,6)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BILLY MITCHELL SODAR -- Last 7 days from ' + last_dt_str)
            elif idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
                ax.set_xlabel('BILLY MITCHELL SODAR -- Last 7 days from ' + last_dt_str)
                
        savefig('/home/haines/rayleigh/img/billymitchell_sodar1_last07days.png')


    #######################################
    # Last 1 day (24hrs)
    #######################################
    if plot_type=='latest':
        print ' ... Last 1 days'

        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-1, date2num(dt[-1]))
            ax.xaxis.set_major_locator( HourLocator(range(0,25,1)) )
            ax.xaxis.set_minor_locator( MinuteLocator(range(0,61,30)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BILLY MITCHELL SODAR -- Last 24 hours from ' + last_dt_str)
            elif idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%H') )
                ax.set_xlabel('BILLY MITCHELL SODAR -- Last 24 hours from ' + last_dt_str)

        savefig('/home/haines/rayleigh/img/billymitchell_sodar1_last01days.png')
Esempio n. 5
0
def allwaves(pi, si, yyyy_mm, plot_type='latest'):
    print 'bogue_allwaves_plot ...'

    prev_month, this_month, next_month = procutil.find_months(yyyy_mm)
    yyyy_mm_str = this_month.strftime('%Y_%m')

    ################################
    # [2a] load primary data file
    ################################

    ncFile1='/seacoos/data/nccoos/level1/bogue/adcpwaves/bogue_adcpwaves_'+prev_month.strftime('%Y_%m')+'.nc'
    ncFile2='/seacoos/data/nccoos/level1/bogue/adcpwaves/bogue_adcpwaves_'+this_month.strftime('%Y_%m')+'.nc'

    have_ncFile1 = os.path.exists(ncFile1)
    have_ncFile2 = os.path.exists(ncFile2)

    print ' ... loading data for graph from ...'
    print ' ... ... ' + ncFile1 + ' ... ' + str(have_ncFile1)
    print ' ... ... ' + ncFile2 + ' ... ' + str(have_ncFile2)

    # open netcdf data
    if have_ncFile1 and have_ncFile2:
        nc = pycdf.CDFMF((ncFile1, ncFile2))
    elif not have_ncFile1 and have_ncFile2:
        nc = pycdf.CDFMF((ncFile2,))
    elif have_ncFile1 and not have_ncFile2:
        nc = pycdf.CDFMF((ncFile1,))
    else:
        print ' ... both files do not exist -- NO DATA LOADED'
        return

    # ncvars = nc.variables()
    # print ncvars
    es = nc.var('time')[:]
    units = nc.var('time').units
    dt = [procutil.es2dt(e) for e in es]
    # set timezone info to UTC (since data from level1 should be in UTC!!)
    dt = [e.replace(tzinfo=dateutil.tz.tzutc()) for e in dt]
    # return new datetime based on computer local
    dt_local = [e.astimezone(dateutil.tz.tzlocal()) for e in dt]
    dn = date2num(dt)

    ################################
    # [2b] specify variables 
    ################################
    Hs = nc.var('Hs')[:]
    Tp = nc.var('Tp')[:]
    Tm = nc.var('Tm')[:]
    # Hmax = nc.var('Hmax')[:]
    Dp = nc.var('Dp')[:]
    Dm = nc.var('Dm')[:]

    nc.close()

    ################################
    # [3a] load ancillary files if needed
    ################################

    ncFile1='/seacoos/data/nccoos/level1/bogue/adcp/bogue_adcp_'+prev_month.strftime('%Y_%m')+'.nc'
    ncFile2='/seacoos/data/nccoos/level1/bogue/adcp/bogue_adcp_'+this_month.strftime('%Y_%m')+'.nc'

    have_ncFile1 = os.path.exists(ncFile1)
    have_ncFile2 = os.path.exists(ncFile2)

    print ' ... loading data for graph from ...'
    print ' ... ... ' + ncFile1 + ' ... ' + str(have_ncFile1)
    print ' ... ... ' + ncFile2 + ' ... ' + str(have_ncFile2)

    # open netcdf data
    if have_ncFile1 and have_ncFile2:
        nc = pycdf.CDFMF((ncFile1, ncFile2))
    elif not have_ncFile1 and have_ncFile2:
        nc = pycdf.CDFMF((ncFile2,))
    elif have_ncFile1 and not have_ncFile2:
        nc = pycdf.CDFMF((ncFile1,))
    else:
        print ' ... both files do not exist -- NO DATA LOADED'
        return

    # ncvars = nc.variables()
    # print ncvars
    es2 = nc.var('time')[:]
    units = nc.var('time').units
    dt2 = [procutil.es2dt(e) for e in es2]
    # set timezone info to UTC (since data from level1 should be in UTC!!)
    dt2 = [e.replace(tzinfo=dateutil.tz.tzutc()) for e in dt2]
    dn2 = date2num(dt2)

    ################################
    # [3b] specify variables
    ################################
    wd2 = nc.var('wd')[:]

    nc.close()

    # last dt in data for labels
    dtu = dt[-1]
    dtl = dt_local[-1]

    diff = abs(dtu - dtl)
    if diff.days>0:
        last_dt_str = dtu.strftime("%H:%M %Z on %b %d, %Y") + ' (' + dtl.strftime("%H:%M %Z, %b %d") + ')'
    else:
        last_dt_str = dtu.strftime("%H:%M %Z") + ' (' + dtl.strftime("%H:%M %Z") + ')' \
                      + dtl.strftime(" on %b %d, %Y")

    #######################################
    # Plot setup
    #######################################

    fig = figure(figsize=(10, 8))
    fig.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.1, hspace=0.1)

    ax = fig.add_subplot(4,1,1)
    axs = [ax]

    # ax.plot returns a list of lines, so unpack tuple
    (x, y) = procutil.addnan(dt2, wd2, maxdelta=2./24)
    l1, = ax.plot_date(x, y, fmt='b-')
    l1.set_label('Water Depth (m)')

    ax.set_ylabel('Depth (m)')
    # ax.set_ylim(2.,10.)
    # ax.set_xlim(dt[0], dt[-1]) # first to last regardless of what  
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.set_xticklabels([])

    # this only moves the label not the tick labels
    ax.xaxis.set_label_position('top')
    ax.set_xlabel('BOGUE Wind Waves -- ' + yyyy_mm_str)

    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('Depth (feet)')

    ax2.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax2.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax2.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax2.set_xticklabels([])

    # legend
    ls1 = l1.get_label()
    leg = ax.legend((l1,), (ls1,), loc='upper left')
    ltext  = leg.get_texts()  # all the text.Text instance in the legend
    llines = leg.get_lines()  # all the lines.Line2D instance in the legend
    frame  = leg.get_frame()  # the patch.Rectangle instance surrounding the legend
    frame.set_facecolor('0.80')      # set the frame face color to light gray
    frame.set_alpha(0.5)             # set alpha low to see through
    setp(ltext, fontsize='small')    # the legend text fontsize
    setp(llines, linewidth=1.5)      # the legend linewidth
    # leg.draw_frame(False)           # don't draw the legend frame

    #######################################
    #
    ax = fig.add_subplot(4,1,2)
    axs.append(ax)

    # ax.plot returns a list of lines, so unpack tuple
    (x, y) = procutil.addnan(dt, Hs, maxdelta=2./24)
    l1, = ax.plot_date(x, y, fmt='b-')
    l1.set_label('Significant Wave Height (Hs)')

    # (x, y) = procutil.addnan(dt, Hmax, maxdelta=2./24)
    # l2, = ax.plot_date(x, y, fmt='g-')
    # l2.set_label('Max Wave Height (Hmax)')

    ax.set_ylabel('WAVE\nHEIGHT (m)')
    # ax.set_ylim(2.,10.)
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.set_xticklabels([])

    # right-hand side scale
    ax2 = twinx(ax)
    ax2.yaxis.tick_right()
    # convert (lhs) meters to (rhs) feet
    feet = [procutil.meters2feet(val) for val in ax.get_ylim()]
    ax2.set_ylim(feet)
    ax2.set_ylabel('(feet)')

    ax2.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax2.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax2.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax2.set_xticklabels([])

    # legend
    ls1 = l1.get_label()
    # ls2 = l2.get_label()
    # leg = ax.legend((l1,l2), (ls1,ls2), loc='upper left')
    leg = ax.legend((l1,), (ls1,), loc='upper left')
    ltext  = leg.get_texts()  # all the text.Text instance in the legend
    llines = leg.get_lines()  # all the lines.Line2D instance in the legend
    frame  = leg.get_frame()  # the patch.Rectangle instance surrounding the legend
    frame.set_facecolor('0.80')      # set the frame face color to light gray
    frame.set_alpha(0.5)             # set alpha low to see through
    setp(ltext, fontsize='small')    # the legend text fontsize
    setp(llines, linewidth=1.5)      # the legend linewidth
    # leg.draw_frame(False)           # don't draw the legend frame

    #######################################
    #
    ax = fig.add_subplot(4,1,3)
    axs.append(ax)

    # ax.plot returns a list of lines, so unpack tuple
    (x, y) = procutil.addnan(dt, Tp, maxdelta=2./24)
    l1, = ax.plot_date(x, y, fmt='b-')
    l1.set_label('Peak Period (Tp)')

    (x, y) = procutil.addnan(dt, Tm, maxdelta=2./24)
    l2, = ax.plot_date(x, y, fmt='c-')
    l2.set_label('Mean Period (Tm)')

    ax.set_ylabel('WAVE\nPERIOD (s)')
    # ax.set_ylim(2.,10.)
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.set_xticklabels([])

    # legend
    ls1 = l1.get_label()
    ls2 = l2.get_label()
    leg = ax.legend((l1,l2), (ls1,ls2), loc='upper left')
    ltext  = leg.get_texts()  # all the text.Text instance in the legend
    llines = leg.get_lines()  # all the lines.Line2D instance in the legend
    frame  = leg.get_frame()  # the patch.Rectangle instance surrounding the legend
    frame.set_facecolor('0.80')      # set the frame face color to light gray
    frame.set_alpha(0.5)             # set alpha low to see through
    setp(ltext, fontsize='small')    # the legend text fontsize
    setp(llines, linewidth=1.5)      # the legend linewidth
    # leg.draw_frame(False)           # don't draw the legend frame

    #######################################
    #
    ax = fig.add_subplot(4,1,4)
    axs.append(ax)

    # ax.plot returns a list of lines, so unpack tuple
    (x, y) = procutil.addnan(dt, Dp, maxdelta=2./24)
    l1, = ax.plot_date(x, y, fmt='b-')
    l1.set_label('Peak Direction (Dp)')

    (x, y) = procutil.addnan(dt, Dm, maxdelta=2./24) 
    l2, = ax.plot_date(x, y, fmt='c-')
    l2.set_label('Mean Direction (Dp)')

    ax.set_ylabel('WAVE\nDIR (deg N)')
    ax.set_ylim(0.,360.)
    # first to last regardless of what
    # ax.set_xlim(dt[0], dt[-1])
    # last minus 30 days, 
    ax.set_xlim(date2num(this_month), date2num(next_month-datetime.timedelta(seconds=1)))
    ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
    ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
    ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )

    ax.set_xlabel('BOGUE Waves -- ' + yyyy_mm_str)

    # legend
    ls1 = l1.get_label()
    ls2 = l2.get_label()
    leg = ax.legend((l1,l2), (ls1,ls2), loc='upper left')
    ltext  = leg.get_texts()  # all the text.Text instance in the legend
    llines = leg.get_lines()  # all the lines.Line2D instance in the legend
    frame  = leg.get_frame()  # the patch.Rectangle instance surrounding the legend
    frame.set_facecolor('0.80')      # set the frame face color to light gray
    frame.set_alpha(0.5)             # set alpha low to see through
    setp(ltext, fontsize='small')    # the legend text fontsize
    setp(llines, linewidth=1.5)      # the legend linewidth
    # leg.draw_frame(False)           # don't draw the legend frame

    # save figure for this month
    ofn = '/home/haines/rayleigh/img/bogue/bogue_allwaves_'+yyyy_mm_str+'.png'
    print '... ... write: %s' % (ofn,)
    savefig(ofn)


    #######################################
    # Last 30 days
    #######################################
    if plot_type=='latest':
        print ' ... Last 30 days'
        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-30, date2num(dt[-1]))
            ax.xaxis.set_major_locator( DayLocator(range(2,32,2)) )
            ax.xaxis.set_minor_locator( HourLocator(range(0,25,12)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BOGUE All Waves -- Last 30 days from ' + last_dt_str)
            elif idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
                ax.set_xlabel('BOGUE All Waves -- Last 30 days from ' + last_dt_str)

        savefig('/home/haines/rayleigh/img/bogue_allwaves_last30days.png')


    #######################################
    # Last 7 days
    #######################################
    if plot_type=='latest':
        print ' ... Last 7 days'
        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-7, date2num(dt[-1]))
            ax.xaxis.set_major_locator( DayLocator(range(0,32,1)) )
            ax.xaxis.set_minor_locator( HourLocator(range(0,25,6)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BOGUE All Waves -- Last 7 days from ' + last_dt_str)
            elif idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%m/%d') )
                ax.set_xlabel('BOGUE All Waves -- Last 7 days from ' + last_dt_str)
                
        savefig('/home/haines/rayleigh/img/bogue_allwaves_last07days.png')


    #######################################
    # Last 1 day (24hrs)
    #######################################
    if plot_type=='latest':
        print ' ... Last 1 days'

        for idx, ax in enumerate(axs):
            ax.set_xlim(date2num(dt[-1])-1, date2num(dt[-1]))
            ax.xaxis.set_major_locator( HourLocator(range(0,25,1)) )
            ax.xaxis.set_minor_locator( MinuteLocator(range(0,61,30)) )
            ax.set_xticklabels([])
            if idx==0:
                ax.set_xlabel('BOGUE All Waves -- Last 24 hours from ' + last_dt_str)
            elif idx==len(axs)-1:
                ax.xaxis.set_major_formatter( DateFormatter('%H') )
                ax.set_xlabel('BOGUE All Waves -- Last 24 hours from ' + last_dt_str)

        savefig('/home/haines/rayleigh/img/bogue_allwaves_last01days.png')