Пример #1
0
 def _raw_ticks(self, vmin, vmax):
     self._guess_steps(vmin, vmax)
     return MaxNLocator._raw_ticks(self, vmin, vmax)
Пример #2
0
 def _raw_ticks(self, vmin, vmax):
     self._guess_steps(vmin, vmax)
     return MaxNLocator._raw_ticks(self, vmin, vmax)
Пример #3
0
def get_plot(params):
    time_min = dt.datetime.strptime(params['time_min'],
                                    '%Y-%m-%dT%H:%M:00.000Z')
    time_max = dt.datetime.strptime(params['time_max'],
                                    '%Y-%m-%dT%H:%M:00.000Z')
    barbs = 'barbs' in params.keys() and params['barbs'] == 'True'
    pbl = 'pbl' in params.keys() and params['pbl'] == 'True'
    var = params['var']
    lgd = None
    has_barbs = var == 'barbs' or barbs
    if var == 'barbs':
        lidars = get_barb_data(params)
    else:
        lidars = get_lidar_data(params)
    if barbs:
        ds_barbs = get_barb_data(params)
    nds = len(lidars)
    figsize = (10, 3.5 * nds)
    sharey = False
    f, axarr = plt.subplots(nds, #sharex=True,
                            sharey=sharey,
                            squeeze=False,
                            figsize=figsize)
    cbar_kwargs = {'label': cb_dict[var]}
    is_centered = centered_dict[var]
    graph_center = 0 if is_centered else False
    cmap = 'coolwarm' if is_centered else 'jet'

    for i, ds in enumerate(lidars):
        ax = axarr[i][0]
        title = ds.attrs['lidar'] + ' (' + ds.attrs['scan'] + ')'
        if has_barbs: # get nice range intervals
            # find the scan range_res
            ranges = ds.coords['Range'].values
            ydelta = ranges[1] - ranges[0]
            # get the desired average barb height locations
            ysteps = np.arange(1, 10)
            yloc = MaxNLocator(nbins=barb_heights, steps=ysteps)
            heights = yloc._raw_ticks(0, len(ranges))
            dheight = (heights[1] - heights[0]) * ydelta
            
        if var == 'barbs':
            ds['windspeed'].rasp.plot_barbs(x='Time', y='Range',
                                            components=['x', 'y'],
                                            # resample=barb_resample,
                                            # resampley=barb_bins,
                                            resampley=dheight,
                                            ax=ax,
                                            length=barb_length)
            ax.set_title(title)
            ax.set_xlim([time_min, time_max])
            ax.set_xlabel('Time (UTC)')
            ax.set_ylabel('Range (km)')
        else:
            vmin = vmin_dict[var] if var in vmin_dict.keys() else None
            vmax = vmax_dict[var] if var in vmax_dict.keys() else None
            try:
                da = ds[var]
                da.plot.pcolormesh(x='Time', y='Range', center=graph_center,
                                   robust=True, cmap=cmap, ax=ax,
                                   vmin=vmin, vmax=vmax,
                                   cbar_kwargs=cbar_kwargs)
            except:
                # this happens occasionally when all data is NA, or
                # there's only one profile of data
                Z = np.zeros((ds.dims['Time'], ds.dims['Range'])).transpose()
                # Z = da.values.transpose()
                Zm = np.ma.masked_where(np.isnan(Z), Z)
                ax.pcolormesh(ds.coords['Time'].values,
                              ds.coords['Range'].values, Zm)

            if pbl:
                # add pbl
                ds['pbl'] = estimate_residual_layer(ds['cnr_whole'])
                ax.scatter(ds.coords['Time'].values, ds['pbl'], 50, marker='.', color='red',
                           edgecolor='gray', lw=.5, label='PBL (Residual Layer)')
                ax.legend(loc=1)
            
            ax.set_title(title)
            ax.set_xlim([time_min, time_max])
            ax.set_xlabel('Time (UTC)')
            ax.set_ylabel('Range (km)')
            if barbs and ds_barbs[i] is not None:
                ds = ds_barbs[i]
                ds['windspeed'].rasp.plot_barbs(x='Time', y='Range',
                                                components=['x', 'y'],
                                                # resample=barb_resample,
                                                # resampley=barb_bins,
                                                resampley=dheight,
                                                ax=ax,
                                                length=barb_length,
                                                lw=barb_lw)
    png_output = BytesIO()
    if lgd is None:
        plt.tight_layout()
        canvas = FigureCanvas(plt.gcf())
        canvas.print_png(png_output)
    else:
        plt.savefig(png_output, format='png',
                    bbox_extra_artists=(lgd,),
                    bbox_inches='tight')
    response = png_output.getvalue()
    # have to make sure to close things duh
    plt.close()
    png_output.close()
    return response