Exemplo n.º 1
0
def extalg_plot(gi, imgkey=None):

    gi.set_plotting_params(gi)

    if imgkey and imgkey == 'rainrate':

        colormapper = cm.ScalarMappable(norm=colors.NoNorm(), cmap=get_cmap('frozen_cmap'))
        currimg = colormapper.to_rgba(normalize(gi.image['rainrate']['frozen']))
        # imshow expects upside down arrays, but we should not store them upside down
        # so flipud here
        gi.basemap.imshow(np.flipud(gi.image['rainrate']['frozen']))

        colormapper = cm.ScalarMappable(norm=colors.NoNorm(), cmap=get_cmap('liquid_cmap'))
        currimg = colormapper.to_rgba(normalize(gi.image['rainrate']['liquid']))
        # imshow expects upside down arrays, but we should not store them upside down
        # so flipud here
        gi.basemap.imshow(np.flipud(gi.image['rainrate']['liquid']))

        ##if 'float' in str(gi.image[imgkey].dtype):
        ##    pass
        ##else:
        ##    gi.image[imgkey].dtype = 'float64'
        ##gi.basemap.imshow(np.flipud(currimg), ax=gi.axes, interpolation='nearest')


    if gi.is_final:
        gi.finalize()
Exemplo n.º 2
0
def extalg_plot(gi, imgkey=None):

    gi.set_plotting_params(gi)

    if imgkey and imgkey == 'rainrate':

        colormapper = cm.ScalarMappable(norm=colors.NoNorm(),
                                        cmap=get_cmap('frozen_cmap'))
        currimg = colormapper.to_rgba(normalize(
            gi.image['rainrate']['frozen']))
        gi.basemap.imshow(gi.image['rainrate']['frozen'])

        colormapper = cm.ScalarMappable(norm=colors.NoNorm(),
                                        cmap=get_cmap('liquid_cmap'))
        currimg = colormapper.to_rgba(normalize(
            gi.image['rainrate']['liquid']))
        gi.basemap.imshow(gi.image['rainrate']['liquid'])

        ##if 'float' in str(gi.image[imgkey].dtype):
        ##    pass
        ##else:
        ##    gi.image[imgkey].dtype = 'float64'
        ##gi.basemap.imshow(currimg, ax=gi.axes, interpolation='nearest')

    if gi.is_final:
        gi.finalize()
Exemplo n.º 3
0
    def image(self):
        if not hasattr(self, '_image'):
            img_dts = {}
            pname = self.product.name
            sname = self.sector.name
            img_dts['start_fullsingleimg' + sname + pname] = datetime.utcnow()
            log.info('Creating basic image.')
            print_mem_usage(self.logtag + 'gimgbeforeregister', True)

            #Register data to area definition
            #Performing prior to color gun generation in order to allow
            #   for multiple data resolutions

            gun = self.product.images['img']
            img_dts['start_clrgunsingle' + sname + pname] = datetime.utcnow()
            self._image = np.flipud(create_color_gun(self.registered_data,
                                                     gun))
            img_dts['end_clrgunsingle' + sname + pname] = datetime.utcnow()

            # add flexibility:  if Boundary is added in the productfile.mxl
            #     the discrete colorbar is selected.
            if len(self.product.colorbars
                   ) > 0 and self.product.colorbars[0].norm == 'Boundary':
                #ticks = [float(i) for i in self.product.colorbars[0].bounds.split(' ')]
                #bounds = [ticks[0]-1] + ticks + [ticks[-1]+1]
                colormapper = cm.ScalarMappable(norm=None,
                                                cmap=get_cmap(
                                                    self.product.cmap))
            else:
                colormapper = cm.ScalarMappable(norm=colors.NoNorm(),
                                                cmap=get_cmap(
                                                    self.product.cmap))

            img_dts['start_torgbasingle' + sname + pname] = datetime.utcnow()
            self._image = colormapper.to_rgba(self.image)
            img_dts['end_torgbasingle' + sname + pname] = datetime.utcnow()
            log.info(sname + pname + ' Done Creating single channel image.')
            img_dts['end_fullsingleimg' + sname + pname] = datetime.utcnow()

            for sttag in sorted(img_dts.keys()):
                if 'start_' in sttag:
                    tag = sttag.replace('start_', '')
                    try:
                        log.info('process image time %-40s: ' % tag +
                                 str(img_dts['end_' + tag] -
                                     img_dts['start_' + tag]))
                    except:
                        log.info('WARNING! No end time for ' + sttag)
        return self._image
Exemplo n.º 4
0
def geo_stitched_plot(gi, imgkey=None):

    if not imgkey:
        return

    if 'Infrared' in imgkey:
        fg = gi.image[imgkey]
    elif 'Visible' in imgkey:
        fg = gi.image[imgkey]

    log.info('Setting up fig and ax for dataset: %s' % (imgkey))
    set_plotting_params(gi,
                        speed=None,
                        platform=None,
                        source=None,
                        prodname=imgkey,
                        bgname=None,
                        start_dt=None,
                        end_dt=None)

    log.info('Plotting imgkey: %s' % (imgkey))

    gi.basemap.imshow(fg,
                      ax=gi.axes,
                      cmap=get_cmap('Greys_r'),
                      interpolation='nearest')

    if gi.is_final:
        gi.finalize()
Exemplo n.º 5
0
    def plot(self):
        #Figure and axes
        self._figure, self._axes = self._create_fig_and_ax()
        #self.axes.legend(loc=4,fontsize='small')

        #colorlist=['fuchsia','lightcyan','turquoise','lightseagreen','springgreen',
        #           'limegreen','green','yellow','tan','orange','chocolate','red','maroon','black']
        #cmap = matplotlib.colors.ListedColormap(colorlist,N=len(colorlist))

        if len(self.product.colorbars
               ) > 0 and self.product.colorbars[0].norm == 'Boundary':
            cmap = self.product.cmap
            ticks = [
                float(i) for i in self.product.colorbars[0].bounds.split(' ')
            ]
            bounds = [ticks[0] - 1] + ticks + [ticks[-1] + 1]
            norm = colors.BoundaryNorm(bounds, get_cmap(self.product.cmap).N)

            self.basemap.imshow(self.image,
                                ax=self.axes,
                                interpolation='nearest',
                                cmap=cmap,
                                norm=norm)
        else:
            self.basemap.imshow(self.image,
                                ax=self.axes,
                                interpolation='nearest')

        if self.is_final:
            self.finalize()
Exemplo n.º 6
0
    def __call__(self, df, prod, out=None):
        # Make sure the data file only has one resolution of data
        if len(df.datasets) != 1:
            raise GIPlotError(
                'More than one dataset encountered in data file.')

        log.info('\tCreating image')
        img = self.get_image(df, prod)

        log.info('\tCreating figure and axes')
        figsize = np.array(
            (img.shape[1], img.shape[0])) / rcParams['figure.dpi']
        fig = plt.figure(figsize=figsize)
        ax = fig.add_axes((0, 0, 1, 1))

        # Create alpha layer for RGB images
        if img.ndim == 3:
            alpha = np.array(~np.any(img.mask, axis=2), dtype=float)
            img = np.dstack([img, alpha])

        log.info('\tPlotting image on axes')
        if prod.cmap:
            cmap = get_cmap(prod.cmap)
        else:
            cmap = None
        ax.imshow(img, vmin=0.0, vmax=1.0, cmap=cmap)

        if out:
            if not os.path.isdir(os.path.dirname(out)):
                log.info('\tCreating output directory')
                os.makedirs(os.path.dirname(out))
            log.info('\tSaving image to {}'.format(out))
            fig.savefig(out, interpolation=None, transparent=True)
            log.info('\tSUCCESS')

            if os.getenv('SLIDER2RSYNC') == 'True':
                if prod.name in rsync.PRODUCT_MAP:
                    log.debug(
                        'Attempting to rsync {} imagery to slider2'.format(
                            prod.name))
                    rsync(out)
                else:
                    log.debug('Product {} has no path for rsync.'.format(
                        prod.name))

        return fig, ax
Exemplo n.º 7
0
    def image(self):
        if not hasattr(self, '_image'):
            img_dts = {}
            pname = self.product.name
            sname = self.sector.name
            img_dts['start_fullsingleimg' + sname + pname] = datetime.utcnow()
            log.info('Creating basic image.')
            print_mem_usage(self.logtag + 'gimgbeforeregister', True)

            #Register data to area definition
            #Performing prior to color gun generation in order to allow
            #   for multiple data resolutions

            gun = self.product.images['img']

            img_dts['start_clrgunsingle' + sname + pname] = datetime.utcnow()
            self._image = np.flipud(create_color_gun(self.registered_data,
                                                     gun))
            img_dts['end_clrgunsingle' + sname + pname] = datetime.utcnow()
            colormapper = cm.ScalarMappable(norm=colors.NoNorm(),
                                            cmap=get_cmap(self.product.cmap))
            img_dts['start_torgbasingle' + sname + pname] = datetime.utcnow()
            self._image = colormapper.to_rgba(self.image)
            img_dts['end_torgbasingle' + sname + pname] = datetime.utcnow()
            log.info(sname + pname + ' Done Creating single channel image.')
            img_dts['end_fullsingleimg' + sname + pname] = datetime.utcnow()

            for sttag in sorted(img_dts.keys()):
                if 'start_' in sttag:
                    tag = sttag.replace('start_', '')
                    try:
                        log.info('process image time %-40s: ' % tag +
                                 str(img_dts['end_' + tag] -
                                     img_dts['start_' + tag]) + ' ' +
                                 socket.gethostname())
                    except:
                        log.info('WARNING! No end time for ' + sttag)
        return self._image
Exemplo n.º 8
0
def winds_plot(gi, imgkey=None):


    df = gi.image[imgkey]['datafile']
    ds = df.datasets[imgkey]

    bgname = 'None' 
    prodname = imgkey
    day_percent = None
    if 'BACKGROUND' in gi.image[imgkey]:
        bgfile = gi.image[imgkey]['BACKGROUND']
        bgvarname = df.metadata['ds'][imgkey]['alg_channel']
        bgvar = bgfile.variables[bgvarname]
        lats = bgfile.geolocation_variables['Latitude']
        lons = bgfile.geolocation_variables['Longitude']
        sunzen = bgfile.geolocation_variables['SunZenith']
        from .motion_config import motion_config
        from geoips.geoalgs.lib.dataEnhancements import enhanceDataArrays
        if bgvar.name not in motion_config(bgfile.source_name).keys():
            log.warning('Variable %s not defined in motion_config for %s, can not find background, not plotting'%
				(bgvar.name, bgfile.source_name))
            return
        config = motion_config(bgfile.source_name)[bgvar.name]
        bgcmap = 'Greys'
        if 'plot_params' in config.keys() \
            and 'EnhImage' in config['plot_params'].keys() \
            and 'cmap' in config['plot_params']['EnhImage'].keys():
            bgcmap = config['plot_params']['EnhImage']['cmap']

        bgvar, blah, blah2 = enhanceDataArrays(bgvar, config, sunzen1=sunzen)

        chanstr = re.sub(r"^B","Channel ",bgvarname).replace('BT',' BT').replace('Ref',' Reflectance')
        if bgvar.wavelength:
            bgname = '%s - %s, %s um'%(bgvar.platform_name, chanstr, bgvar.wavelength)
        else:
            bgname = '%s - %s'%(bgvar.platform_name, chanstr)
        if np.ma.count(bgvar):
            try:
                day_percent = (1.0 * np.ma.count(bgvar[ds.day_inds]) / np.ma.count(bgvar)) * 100
            except KeyError:
                pass

    if gi.datafile.dataprovider is not None:
        prodname = prodname+', '+gi.datafile.dataprovider
    if day_percent is not None:
        prodname = '%s Product: %d'%(prodname, day_percent) + '% day'
    prodname = prodname.replace('_',' ')

    log.info('Setting up fig and ax for dataset: %s with bgname: %s'%(prodname, bgname))

    new_platform = gi.datafile.metadata['top']['alg_platform']
    new_source = gi.datafile.metadata['top']['alg_source']

    log.info('Plotting dataset: %s'%(imgkey))

    qi = ds.variables['qis']
    speed_kts = ms_to_kts(ds.variables['speed_ms'])
    #good_inds = np.ma.where(qi>0.2)
    good_inds = np.ma.where(speed_kts)
    # Plot knots, store in text file as m/s
    direction_deg = ds.variables['direction_deg'][good_inds]
    speed_kts = speed_kts[good_inds]
    u_kts, v_kts = spd2uv(speed_kts, direction_deg)
    pres_mb = ds.variables['pres_mb'][good_inds]
    lats = ds.variables['lats'][good_inds]
    lons = ds.variables['lons'][good_inds]

    if 'All_Pressure_Levels' in imgkey:
        # color_levs = ['red','cyan','yellow','green','tan'] 
        # pressure_levs = [0,400,600,800,950,1014] 
        color_levs = ['red', 'cyan', 'tan']
        pressure_levs = [0, 400, 800, 1014] 
        [lats,lons,u_kts,v_kts] = get_pressure_levels(pres_mb, [lats,lons,u_kts,v_kts], pressure_levs)


    # Note - if we set this to platform_display and source_display, the 
    # filenames will not reflect the actual satellite/sensor (winds/winds).
    # But when it is set to platform/source, it actually changes the platform
    # and source in the datafile, which breaks all subsequent sectors.
    # So using set_winds_plotting_params to change source/platform
    # FORCES a single sector. I'll have to look into whether there is
    # an intelligent way to handle this. For now. One sector...
    if speed_kts.shape[0] == 0:
        log.warning('No valid winds, returning without attempting to plot')
        return 
    if 'All_Pressure_Levels' in imgkey:
        set_winds_plotting_params(gi, speed=None, pressure=pres_mb, altitude=None, 
            #platform_display=new_platform, source_display=new_source, 
            platform=new_platform, source=new_source, 
            prodname=prodname, bgname=bgname, listed_colormap_vals=color_levs,
            ticks_vals=pressure_levs)
    else:
        set_winds_plotting_params(gi, speed_kts, None, None, 
            #platform_display=new_platform, source_display=new_source, 
            platform=new_platform, source=new_source, 
            prodname=prodname, bgname=bgname)

    if 'BACKGROUND' in gi.image[imgkey]:
        log.info('Plotting background image %s'%(bgname))
        # np.flipud all data in the imshow step - as that is the only 
        # command that expects upside down arrays
        gi.basemap.imshow(np.flipud(bgvar),ax=gi.axes,cmap=get_cmap(bgcmap))


    '''
    NOTE there appears to be an error in basemap - I had to add a try except to allow 
    for different outputs from np.where
    4778                 thresh = 360.-londiff_sort[-2] if nlons > 2 else 360.0 - londiff_sort[-1]
    ***4779                 try:
    ***4780                     itemindex = len(lonsin)-np.where(londiff>=thresh)[0][0]
    ***4781                 except IndexError:
    ***4782                     itemindex = len(lonsin)-np.where(londiff>=thresh)[0]
    4783             else:
    4784                 itemindex = 0
    4785
    4786             if fix_wrap_around and itemindex:
    4787                 # check to see if cyclic (wraparound) point included
    4788                 # if so, remove it.
    4789                 if np.abs(lonsin[0]-lonsin[-1]) < 1.e-4:
    4790                     hascyclic = True
    4791                     lonsin_save = lonsin.copy()
    4792                     lonsin = lonsin[1:]
    /satops/geoips_externals_nrl-2.7/built/anaconda2/lib/python2.7/site-packages/mpl_toolkits/basemap/__init__.py
    '''


    if 'All_Pressure_Levels' in imgkey:
        log.info('Plotting all barbs with colors {} at pressure levels {}'.format(color_levs, pressure_levs))

        # These are (potentially) stored in global lists of vectors - it just plots the ones with coverage in "barbs"
        # Not sure how to tell quickly/easily a priori how many vectors will actually be plotted over a given 
        # sector.  This is going to look way too dense on a global/large sector

        # May be able to thin based on resolution of sector (basically, number of pixels per barb ?)

        max_total_vecs = 12000
        total_num_vecs = 0
        for ulev in u_kts:
            total_num_vecs += np.ma.count(ulev)

        for (ulev,vlev,latlev,lonlev,colorlev) in zip(u_kts,v_kts,lats,lons, color_levs):
            num_vecs = np.ma.count(ulev)
            if num_vecs == 0:
                log.info('Not plotting color {}, no winds'.format(colorlev))
                continue

            max_vecs = int(max_total_vecs * (1.0 * num_vecs / total_num_vecs))
            log.info('Plotting color {0:<10}, number barbs {1}, max barbs of {2}'.format(
                     colorlev, num_vecs, max_vecs))

            [lonlev, latlev, ulev, vlev] = thin_arrays(
                                num_vecs,
                                max_points=max_vecs,
                                arrs=[lonlev, latlev, ulev, vlev])

            num_vecs = np.ma.count(ulev)
            log.info('                   new number barbs {}'.format(num_vecs))

            gi.basemap.barbs(lonlev.data,latlev.data,
                        ulev,vlev,
                        color=colorlev,
                        ax=gi.axes,
                        #sizes=dict(height=0.8, spacing=0.3),
                        # height is length of flag on barb, as percentage of length
                        # spacing is spacing of flags on barb, as percentage of length of flag
                        sizes=dict(height=0.4, spacing=0.2),
                        linewidth=0.5,
                        # length is length of actual barb
                        length=5,
                        latlon=True)
    else:
        log.info('Plotting single level barbs with colorbars %s'%(gi.colorbars))

        gi.basemap.barbs(lons.data,lats.data,
                        u_kts,v_kts,speed_kts,
                        ax=gi.axes,
                        cmap=gi.colorbars[0].cmap,
                        #sizes=dict(height=0.8, spacing=0.3),
                        sizes=dict(height=1, spacing=0.5),
                        norm=gi.colorbars[0].norm,
                        linewidth=0.5,
                        length=5,
                        #length=5,
                        latlon=True)


    if gi.is_final:
        gi.finalize()
Exemplo n.º 9
0
def winds_plot(gi, imgkey=None):

    df = gi.image[imgkey]['datafile']
    ds = df.datasets[imgkey]

    bgname = 'None'
    prodname = imgkey
    day_percent = None
    if 'BACKGROUND' in gi.image[imgkey]:
        bgfile = gi.image[imgkey]['BACKGROUND']
        bgvarname = df.metadata['ds'][imgkey]['alg_channel']
        bgvar = np.flipud(bgfile.variables[bgvarname])
        lats = bgfile.geolocation_variables['Latitude']
        lons = bgfile.geolocation_variables['Longitude']
        sunzen = bgfile.geolocation_variables['SunZenith']
        from .motion_config import motion_config
        from .EnhancedImage import EnhancedImage
        if bgvar.name not in motion_config(bgfile.source_name).keys():
            log.warning(
                'Variable %s not defined in motion_config for %s, can not find background, not plotting'
                % (bgvar.name, bgfile.source_name))
            return
        config = motion_config(bgfile.source_name)[bgvar.name]
        bgcmap = 'Greys'
        if 'plot_params' in config.keys() \
            and 'EnhImage' in config['plot_params'].keys() \
            and 'cmap' in config['plot_params']['EnhImage'].keys():
            bgcmap = config['plot_params']['EnhImage']['cmap']

        enhdata = EnhancedImage(
            bgvar,
            bgvar.shape,
            lats,
            lons,
            sunzen=sunzen,
        )
        enhdata.enhanceImage(config)
        bgvar = enhdata.Data

        chanstr = re.sub(r"^B", "Channel ",
                         bgvarname).replace('BT', ' BT').replace(
                             'Ref', ' Reflectance')
        if bgvar.wavelength:
            bgname = '%s - %s, %s um' % (bgvar.platform_name, chanstr,
                                         bgvar.wavelength)
        else:
            bgname = '%s - %s' % (bgvar.platform_name, chanstr)
        if np.ma.count(bgvar):
            try:
                day_percent = (1.0 * np.ma.count(bgvar[ds.day_inds]) /
                               np.ma.count(bgvar)) * 100
            except KeyError:
                pass

    if gi.datafile.dataprovider is not None:
        prodname = prodname + ', ' + gi.datafile.dataprovider
    if day_percent is not None:
        prodname = '%s Product: %d' % (prodname, day_percent) + '% day'
    prodname = prodname.replace('_', ' ')

    log.info('Setting up fig and ax for dataset: %s with bgname: %s' %
             (prodname, bgname))

    new_platform = gi.datafile.metadata['top']['alg_platform']
    new_source = gi.datafile.metadata['top']['alg_source']

    log.info('Plotting dataset: %s' % (imgkey))

    resolution = min(gi.sector.area_info.proj4_pixel_width,
                     gi.sector.area_info.proj4_pixel_height)
    direction = ds.variables['direction']
    speed = ds.variables['speed']
    u = speed * np.cos(np.radians(direction))
    v = speed * np.sin(np.radians(direction))
    pres = ds.variables['pres']
    lats = ds.variables['lats']
    lons = ds.variables['lons']

    from geoips.geoalgs.lib.amv_plot import downsample_winds
    from geoips.geoalgs.lib.amv_plot import set_winds_plotting_params

    set_winds_plotting_params(gi, speed, None, None, new_platform, new_source,
                              prodname, bgname)

    if 'BACKGROUND' in gi.image[imgkey]:
        log.info('Plotting background image %s' % (bgname))
        gi.basemap.imshow(bgvar, ax=gi.axes, cmap=get_cmap(bgcmap))
    '''
    NOTE there appears to be an error in basemap - I had to add a try except to allow 
    for different outputs from np.where
    4778                 thresh = 360.-londiff_sort[-2] if nlons > 2 else 360.0 - londiff_sort[-1]
    ***4779                 try:
    ***4780                     itemindex = len(lonsin)-np.where(londiff>=thresh)[0][0]
    ***4781                 except IndexError:
    ***4782                     itemindex = len(lonsin)-np.where(londiff>=thresh)[0]
    4783             else:
    4784                 itemindex = 0
    4785
    4786             if fix_wrap_around and itemindex:
    4787                 # check to see if cyclic (wraparound) point included
    4788                 # if so, remove it.
    4789                 if np.abs(lonsin[0]-lonsin[-1]) < 1.e-4:
    4790                     hascyclic = True
    4791                     lonsin_save = lonsin.copy()
    4792                     lonsin = lonsin[1:]
    /satops/geoips_externals_nrl-2.7/built/anaconda2/lib/python2.7/site-packages/mpl_toolkits/basemap/__init__.py
    '''

    log.info('Plotting barbs with colorbars %s' % (gi.colorbars))

    gi.basemap.barbs(lons.data,
                     lats.data,
                     u,
                     v,
                     speed,
                     ax=gi.axes,
                     cmap=gi.colorbars[0].cmap,
                     sizes=dict(height=0.8, spacing=0.3),
                     norm=gi.colorbars[0].norm,
                     linewidth=2,
                     length=5,
                     latlon=True)

    if gi.is_final:
        gi.finalize()
Exemplo n.º 10
0
def fields_plot(gi, imgkey=None):

    if not imgkey:
        return
    varname, lev, sectname = imgkey.split('_')
    prod_display_name = varname
    if varname in prodnames.keys():
        prod_display_name = prodnames[varname]
    prodname = '{0} at {1} mb'.format(prod_display_name, lev)
    bgname = None
    dataset = gi.image[imgkey]

    if varname == 'Winds':
        log.info('Setting up fig and ax for dataset: %s with bgname: %s' %
                 (prodname, bgname))
        u_kts = dataset.variables['uwind' + lev]
        v_kts = dataset.variables['vwind' + lev]
        numvecs = np.ma.count(u_kts)
        maxvecs = 4000
        speed_kts, direc_deg = uv2spd(u_kts, v_kts)
        lons = dataset.geolocation_variables['Longitude']
        lats = dataset.geolocation_variables['Latitude']
        [u_kts, v_kts, lats, lons,
         speed_kts] = thin_arrays(numvecs,
                                  max_points=maxvecs,
                                  arrs=[u_kts, v_kts, lats, lons, speed_kts])
        set_winds_plotting_params(gi,
                                  speed_kts,
                                  pressure=None,
                                  altitude=None,
                                  platform=dataset.platform_name,
                                  source=dataset.source_name,
                                  prodname=prodname,
                                  bgname=bgname,
                                  start_dt=dataset.start_datetime,
                                  end_dt=dataset.end_datetime,
                                  ticks_vals=None,
                                  listed_colormap_vals=None)
        gi.basemap.barbs(lons.data,
                         lats.data,
                         u_kts,
                         v_kts,
                         speed_kts,
                         ax=gi.axes,
                         cmap=gi.colorbars[0].cmap,
                         sizes=dict(height=1, spacing=0.5),
                         norm=gi.colorbars[0].norm,
                         linewidth=0.5,
                         length=5,
                         latlon=True)
    else:
        set_winds_plotting_params(gi,
                                  speed=None,
                                  pressure=None,
                                  altitude=None,
                                  platform=dataset.platform_name,
                                  source=dataset.source_name,
                                  prodname=prodname,
                                  bgname=bgname,
                                  start_dt=dataset.start_datetime,
                                  end_dt=dataset.end_datetime,
                                  ticks_vals=None,
                                  listed_colormap_vals=None)
        cmapname = 'tropix_no_white'
        plotdata = dataset.variables[varname + lev]
        interp = 'sinc'
        log.info('Using interpolation %s', interp)
        # imshow expects upside down arrays
        gi.basemap.imshow(np.flipud(plotdata),
                          ax=gi.axes,
                          cmap=get_cmap(cmapname),
                          interpolation=interp)

    if gi.is_final:
        gi.finalize()