コード例 #1
0
ファイル: plot_mesonet.py プロジェクト: tsupinie/research
def plotObservationsComposite(obs, map, title, file_name):
    pylab.clf()
    colors = [ 'r', 'g', 'b', 'c', 'm', '#660099', '#ff9900', '#006666' ]

    ob_ids = np.unique1d(obs['id'])
    ttu_label = False

    for ob_id in ob_ids:
        ob_idxs = np.where(obs['id'] == ob_id)[0]
        these_obs = obs[ob_idxs]
        ob_xs, ob_ys = map(these_obs['longitude'], these_obs['latitude'])

        if ob_id[0] == "P":
            ob_num = int(ob_id[1]) - 1
            pylab.plot(ob_xs, ob_ys, 'o', mfc=colors[ob_num], mec=colors[ob_num], ms=3, label="NSSL MM (%s)" % ob_id)
        else:
            if not ttu_label:
                label = "TTU Sticknet"
                ttu_label = True
            else:
                label = None

            pylab.plot(ob_xs[0], ob_ys[0], 'ko', ms=3, label=label)

    drawPolitical(map, scale_len=5)

    pylab.legend(loc=3, numpoints=1, prop={'size':'medium'})
    pylab.title(title)
    pylab.savefig(file_name)
    return
コード例 #2
0
ファイル: plot_mesonet.py プロジェクト: tsupinie/research
def plotObservations(obs, map, title, file_name, refl=None):
    pylab.clf()

    if refl is not None:
        nx, ny = refl.shape
        xs, ys = np.meshgrid(np.arange(nx) * 1000, np.arange(ny) * 1000)
        map.contour(xs, ys, refl, levels=np.arange(20, 80, 20), colors='k')

    obs_x, obs_y = map(obs['longitude'], obs['latitude'])

    for ob, x, y in zip(obs, obs_x, obs_y):
        pylab.plot(x, y, 'ko', ms=3.)
        pylab.text(x - 500, y + 500, "%4.1f" % ob['temp'], size='small', va='bottom', ha='right', color='r') 
        pylab.text(x - 500, y - 500, "%4.1f" % ob['dewp'], size='small', va='top', ha='right', color='g') 
        pylab.text(x + 500, y - 500, ob['id'], size='small', va='top', ha='left', color='#808080')

    good_idxs = np.where((obs['wind_spd'] >= 0.) & (obs['wind_dir'] >= 0.))

    u = -obs['wind_spd'] * np.sin(obs['wind_dir'] * np.pi / 180) * 1.94
    v = -obs['wind_spd'] * np.cos(obs['wind_dir'] * np.pi / 180) * 1.94
    u_rot, v_rot = map.rotate_vector(u, v, obs['longitude'], obs['latitude'])
    pylab.barbs(obs_x[good_idxs], obs_y[good_idxs], u_rot[good_idxs], v_rot[good_idxs])

    drawPolitical(map, scale_len=5)

    pylab.title(title)
    pylab.savefig(file_name)
    return
コード例 #3
0
def plotTiming(vortex_prob, vortex_times, times, map, grid_spacing, tornado_track, title, file_name, obs=None, centers=None, min_prob=0.1):
    nx, ny = vortex_prob.shape
    gs_x, gs_y = grid_spacing

    xs, ys = np.meshgrid(gs_x * np.arange(nx), gs_y * np.arange(ny))

    time_color_map = matplotlib.cm.Accent
    time_color_map.set_under('#ffffff')

    vortex_times = np.where(vortex_prob >= min_prob, vortex_times, -1)

    track_xs, track_ys = map(*reversed(tornado_track))

    pylab.figure(figsize=(10, 8))
    pylab.axes((0.025, 0.025, 0.95, 0.925))

    pylab.pcolormesh(xs, ys, vortex_times, cmap=time_color_map, vmin=times.min(), vmax=times.max())

    tick_labels = [ (datetime(2009, 6, 5, 18, 0, 0) + timedelta(seconds=int(t))).strftime("%H%M") for t in times ]
    bar = pylab.colorbar()#orientation='horizontal', aspect=40)
    bar.locator = FixedLocator(times)
    bar.formatter = FixedFormatter(tick_labels)
    bar.update_ticks()

    pylab.plot(track_xs, track_ys, 'mv-', lw=2.5, mfc='k', ms=8)

    drawPolitical(map, scale_len=(xs[-1, -1] - xs[0, 0]) / 10.)

    pylab.title(title)
    pylab.savefig(file_name)
    pylab.close()
コード例 #4
0
ファイル: read_enkf_rad.py プロジェクト: Meteodan/research
def plotRadTilt(plot_data, plot_cmaps, plot_titles, grid, file_name, base_ref=None):
    subplot_base = 220
    n_plots = 4

    xs, ys, gs_x, gs_y, map = grid

    pylab.figure(figsize=(12,12))
    pylab.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.02, wspace=0.04)

    for plot in range(n_plots):
        pylab.subplot(subplot_base + plot + 1)
        cmap, vmin, vmax = plot_cmaps[plot]
        cmap.set_under("#ffffff", alpha=0.0)

        pylab.pcolormesh(xs - gs_x / 2, ys - gs_y / 2, plot_data[plot] >= -90, vmin=0, vmax=1, cmap=mask_cmap)

        pylab.pcolormesh(xs - gs_x / 2, ys - gs_y / 2, plot_data[plot], vmin=vmin, vmax=vmax, cmap=cmap)
        pylab.colorbar()

        if base_ref is not None:
            pylab.contour(xs, ys, base_ref, levels=[10.], colors='k', lw=0.5)

#       if plot == 0:
#           pylab.contour(xs, ys, refl_88D[:, :, 0], levels=np.arange(10, 80, 10), colors='#808080', lw=0.5)

#       pylab.plot(radar_x, radar_y, 'ko')

        pylab.title(plot_titles[plot])

        drawPolitical(map)

    pylab.savefig(file_name)
    pylab.close()

    return
コード例 #5
0
ファイル: plot_assim_obs.py プロジェクト: tsupinie/research
def plotObservationsComposite(obs, map, scale_len, title, file_name):
    pylab.figure(figsize=(10,8))
    pylab.axes((0, 0, 1, 0.95))
    colors = [ 'r', 'g', 'b', 'c', 'm', '#660099', '#ff9900', '#006666' ]

    ob_ids = np.unique1d(obs['id'])
    ttu_label = False
    asos_label = False
    sndg_label = False

    for ob_id in ob_ids:
        ob_idxs = np.where(obs['id'] == ob_id)[0]
        these_obs = obs[ob_idxs]
        ob_xs, ob_ys = map(these_obs['longitude'], these_obs['latitude'])

        if ob_id[0] == "P":
            ob_num = int(ob_id[1]) - 1
            pylab.plot(ob_xs, ob_ys, 'o', mfc=colors[ob_num], mec=colors[ob_num], ms=3, label="NSSL MM (%s)" % ob_id)
        elif ob_id[0] == "K":
            if not asos_label:
                label = "ASOS"
                asos_label = True
            else:
                label = None

            pylab.plot(ob_xs[0], ob_ys[0], 'k*', ms=5, label=label)
        elif ob_id[0] == "1" or ob_id[0] == "2":
            if not ttu_label:
                label = "TTU Sticknet"
                ttu_label = True
            else:
                label = None

            pylab.plot(ob_xs[0], ob_ys[0], 'o', mfc="#999999", mec="#999999", ms=3, label=label)
        elif these_obs[0]['obtype'] == "SNDG":
            if not sndg_label:
                label = "Sounding"
                sndg_label = True
            else:
                label = None

            pylab.plot(ob_xs[0], ob_ys[0], 'k^', ms=4, label=label)

    drawPolitical(map, scale_len=scale_len)

    line_objects = [ l for l in sorted(pylab.gca().lines, key=lambda x: x.get_label()) if l.get_label()[0] != "_" ]
    pylab.legend(line_objects, [ l.get_label() for l in line_objects], loc=2, numpoints=1, prop={'size':'medium'})
    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #6
0
ファイル: plot_mean.py プロジェクト: tsupinie/research
def makeplot(refl, winds, w, stride, map, gs, title, file_name, box=None):
    pylab.figure()
    axmain = pylab.axes((0, 0.025, 1, 0.9))

    gs_x, gs_y = gs
    nx, ny = refl.shape
    xs, ys = np.meshgrid(gs_x * np.arange(nx), gs_y * np.arange(ny))

    pylab.contourf(xs, ys, refl, levels=np.arange(10, 80, 10))
    pylab.colorbar()
    pylab.contour(xs, ys, w, levels=np.arange(-10, 0, 2), colors='#666666', style='--')
    pylab.contour(xs, ys, w, levels=np.arange(2, 12, 2), colors='#666666', style='-')
    
    u, v = winds
    wind_slice = tuple([ slice(None, None, stride) ] * 2)
    pylab.quiver(xs[wind_slice], ys[wind_slice], u[wind_slice], v[wind_slice])

    if box:
        lb_y, lb_x = [ b.start for b in box ]
        ub_y, ub_x = [ b.stop for b in box ]

        box_xs = gs_x * np.array([ lb_x, lb_x, ub_x, ub_x, lb_x])
        box_ys = gs_y * np.array([ lb_y, ub_y, ub_y, lb_y, lb_y])

        map.plot(box_xs, box_ys, '#660099')

        axins = zoomed_inset_axes(pylab.gca(), 4, loc=4)
        pylab.sca(axins)

        pylab.contourf(xs[box], ys[box], refl[box], levels=np.arange(10, 80, 10))
        pylab.contour(xs[box], ys[box], w[box], levels=np.arange(-10, 0, 2), colors='#666666', style='--')
        pylab.contour(xs[box], ys[box], w[box], levels=np.arange(2, 12, 2), colors='#666666', style='-')
        pylab.quiver(xs[box], ys[box], u[box], v[box])

        drawPolitical(map)

        pylab.xlim([lb_x * gs_x, ub_x * gs_x - 1])
        pylab.ylim([lb_y * gs_y, ub_y * gs_y - 1])

        mark_inset(axmain, axins, loc1=1, loc2=3, fc='none', ec='k')

    pylab.sca(axmain)
    drawPolitical(map)

    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #7
0
def plotObservations(obs, map, title, file_name, refl=None):
    pylab.clf()

    if refl is not None:
        nx, ny = refl.shape
        xs, ys = np.meshgrid(np.arange(nx) * 1000, np.arange(ny) * 1000)
        map.contour(xs, ys, refl, levels=np.arange(20, 80, 20), colors='k')

    obs_x, obs_y = map(obs['longitude'], obs['latitude'])

    for ob, x, y in zip(obs, obs_x, obs_y):
        pylab.plot(x, y, 'ko', ms=3.)
        pylab.text(x - 500,
                   y + 500,
                   "%4.1f" % ob['temp'],
                   size='small',
                   va='bottom',
                   ha='right',
                   color='r')
        pylab.text(x - 500,
                   y - 500,
                   "%4.1f" % ob['dewp'],
                   size='small',
                   va='top',
                   ha='right',
                   color='g')
        pylab.text(x + 500,
                   y - 500,
                   ob['id'],
                   size='small',
                   va='top',
                   ha='left',
                   color='#808080')

    good_idxs = np.where((obs['wind_spd'] >= 0.) & (obs['wind_dir'] >= 0.))

    u = -obs['wind_spd'] * np.sin(obs['wind_dir'] * np.pi / 180) * 1.94
    v = -obs['wind_spd'] * np.cos(obs['wind_dir'] * np.pi / 180) * 1.94
    u_rot, v_rot = map.rotate_vector(u, v, obs['longitude'], obs['latitude'])
    pylab.barbs(obs_x[good_idxs], obs_y[good_idxs], u_rot[good_idxs],
                v_rot[good_idxs])

    drawPolitical(map, scale_len=5)

    pylab.title(title)
    pylab.savefig(file_name)
    return
コード例 #8
0
def plotProbability(vortex_prob, map, lower_bound, grid_spacing, tornado_track, title, file_name, obs=None, centers=None, min_prob=0.1, objects=None):
    nx, ny = vortex_prob.shape
    gs_x, gs_y = grid_spacing
    lb_x, lb_y = lower_bound
#   print lb_x, lb_y

    xs, ys = np.meshgrid(gs_x * np.arange(nx), gs_y * np.arange(ny))

    prob_color_map = matplotlib.cm.RdYlBu_r
    prob_color_map.set_under('#ffffff')

    track_xs, track_ys = map(*reversed(tornado_track))

    pylab.figure(figsize=(10, 8))
    pylab.axes((0.025, 0.025, 0.95, 0.925))

#   Plot Vortex Probability
    pylab.pcolormesh(xs, ys, vortex_prob, cmap=prob_color_map, vmin=min_prob, vmax=1.0)
    pylab.colorbar()#orientation='horizontal', aspect=40)

    pylab.plot(track_xs, track_ys, 'mv-', lw=2.5, mfc='k', ms=8)

    if centers:
        lines_x, lines_y = reorganizeCenters(centers, range(14400, 18300, 300))

        for line_x, line_y in zip(lines_x, lines_y):
            pylab.plot(line_x - lb_y, line_y - lb_x, 'ko-', markersize=2, linewidth=1)

    if obs is not None:
        pylab.contour(x, y, obs, levels=[0.95], colors='k')

    if objects:
        for obj in objects:
            obj_t, obj_y, obj_x = removeNones(obj, (13,) + vortex_prob.shape)

            if findSize(obj) >= 8:
                pylab.plot(1000 * np.array([obj_x.start, obj_x.start, obj_x.stop, obj_x.stop, obj_x.start]), 1000 * np.array([obj_y.start, obj_y.stop, obj_y.stop, obj_y.start, obj_y.start]), color='k', zorder=10)

    drawPolitical(map, scale_len=0) # scale_len=(xs[-1, -1] - xs[0, 0]) / 10000.)

    pylab.title(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #9
0
ファイル: determ_vorticity.py プロジェクト: tsupinie/research
def plotVorticity(vorticity, winds, map, title, file_name, stride=4):
    u, v = winds
    pylab.figure()

    thin_data = tuple([ slice(None, None, stride) ] * 2)
    gs_x, gs_y = goshen_1km_gs
    nx, ny = vorticity.shape
    xs, ys = np.meshgrid(gs_x * np.arange(nx), gs_y * np.arange(ny))

    pylab.contourf(xs, ys, vorticity, levels=np.arange(0.0075, 0.034, 0.0025))
    pylab.colorbar()
    pylab.quiver(xs[thin_data], ys[thin_data], u[thin_data], v[thin_data])

    drawPolitical(map)

    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #10
0
def plotVorticity(vorticity, winds, map, title, file_name, stride=4):
    u, v = winds
    pylab.figure()

    thin_data = tuple([slice(None, None, stride)] * 2)
    gs_x, gs_y = goshen_1km_gs
    nx, ny = vorticity.shape
    xs, ys = np.meshgrid(gs_x * np.arange(nx), gs_y * np.arange(ny))

    pylab.contourf(xs, ys, vorticity, levels=np.arange(0.0075, 0.034, 0.0025))
    pylab.colorbar()
    pylab.quiver(xs[thin_data], ys[thin_data], u[thin_data], v[thin_data])

    drawPolitical(map)

    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #11
0
def plotObservationsComposite(obs, map, title, file_name):
    pylab.clf()
    colors = ['r', 'g', 'b', 'c', 'm', '#660099', '#ff9900', '#006666']

    ob_ids = np.unique1d(obs['id'])
    ttu_label = False

    for ob_id in ob_ids:
        ob_idxs = np.where(obs['id'] == ob_id)[0]
        these_obs = obs[ob_idxs]
        ob_xs, ob_ys = map(these_obs['longitude'], these_obs['latitude'])

        if ob_id[0] == "P":
            ob_num = int(ob_id[1]) - 1
            pylab.plot(ob_xs,
                       ob_ys,
                       'o',
                       mfc=colors[ob_num],
                       mec=colors[ob_num],
                       ms=3,
                       label="NSSL MM (%s)" % ob_id)
        else:
            if not ttu_label:
                label = "TTU Sticknet"
                ttu_label = True
            else:
                label = None

            pylab.plot(ob_xs[0], ob_ys[0], 'ko', ms=3, label=label)

    drawPolitical(map, scale_len=5)

    pylab.legend(loc=3, numpoints=1, prop={'size': 'medium'})
    pylab.title(title)
    pylab.savefig(file_name)
    return
コード例 #12
0
def main():
    base_time = datetime(2009, 6, 5, 18, 0, 0)
    epoch = datetime(1970, 1, 1, 0, 0, 0)
    base_epoch = (base_time - epoch).total_seconds()
    times_seconds = range(14700, 18300, 300)
    times = [ base_time + timedelta(seconds=t) for t in times_seconds ]

    bounds = (slice(100, 180), slice(90, 170))
    rev_bounds = [ 0 ]
    rev_bounds.extend(bounds[::-1])
    rev_bounds = tuple(rev_bounds)

    proj = setupMapProjection(goshen_1km_proj, goshen_1km_gs, bounds=bounds)
    map = Basemap(**proj)

    obs_file_names = ['psu_straka_mesonet.pkl', 'ttu_sticknet.pkl', 'asos.pkl', 'soundings_clip.pkl']
    all_obs = loadObs(obs_file_names, times, map, (goshen_1km_proj['width'], goshen_1km_proj['height']), sounding_obs=['soundings_clip.pkl'])

    refl_base = "hdf/KCYS/1km/goshen.hdfrefl2d"
    refl_times = np.array([ int(f[-6:]) for f in glob.glob("%s??????" % refl_base) ])
    refl_keep_times = []
    refl_data = {}

    for tt in times_seconds:
        idx = np.argmin(np.abs(refl_times - tt))
        if refl_times[idx] > tt and idx > 0:
            idx -= 1

        file_name = "%s%06d" % (refl_base, refl_times[idx])
        hdf = nio.open_file(file_name, mode='r', format='hdf')
        refl_keep_times.append(refl_times[idx])
        refl_data[tt] = hdf.variables['refl2d'][rev_bounds]

    for time, reg in inflow_stations.iteritems():
        pylab.figure()

        gs_x, gs_y = goshen_1km_gs
        nx, ny = refl_data[time].shape
        xs, ys = np.meshgrid(gs_x * np.arange(nx), gs_y * np.arange(ny))
        pylab.contourf(xs, ys, refl_data[time], levels=np.arange(10, 80, 10))

        for region, stations in reg.iteritems():
            if region != 'sounding':
                for station in stations:
                    idxs = np.where((all_obs['id'] == station) & (all_obs['time'] == base_epoch + time))
                    ob_xs, ob_ys = map(all_obs['longitude'][idxs], all_obs['latitude'][idxs])

                    if region == 'inflow': color='r'
                    elif region == 'outflow': color='b'

                    wdir = all_obs['wind_dir'][idxs]
                    wspd = all_obs['wind_spd'][idxs]
                    u = -wspd * np.sin(wdir * np.pi / 180.) * 1.94
                    v = -wspd * np.cos(wdir * np.pi / 180.) * 1.94

                    pylab.plot(ob_xs, ob_ys, "%so" % color)
                    pylab.barbs(ob_xs, ob_ys, u, v)

        drawPolitical(map, scale_len=10)

        pylab.savefig("inflow_stations_%06d.png" % time)
        pylab.close()

    return
コード例 #13
0
def makeplot(refl, winds, w, stride, map, gs, title, file_name, box=None):
    pylab.figure()
    axmain = pylab.axes((0, 0.025, 1, 0.9))

    gs_x, gs_y = gs
    nx, ny = refl.shape
    xs, ys = np.meshgrid(gs_x * np.arange(nx), gs_y * np.arange(ny))

    pylab.contourf(xs, ys, refl, levels=np.arange(10, 80, 10))
    pylab.colorbar()
    pylab.contour(xs,
                  ys,
                  w,
                  levels=np.arange(-10, 0, 2),
                  colors='#666666',
                  style='--')
    pylab.contour(xs,
                  ys,
                  w,
                  levels=np.arange(2, 12, 2),
                  colors='#666666',
                  style='-')

    u, v = winds
    wind_slice = tuple([slice(None, None, stride)] * 2)
    pylab.quiver(xs[wind_slice], ys[wind_slice], u[wind_slice], v[wind_slice])

    if box:
        lb_y, lb_x = [b.start for b in box]
        ub_y, ub_x = [b.stop for b in box]

        box_xs = gs_x * np.array([lb_x, lb_x, ub_x, ub_x, lb_x])
        box_ys = gs_y * np.array([lb_y, ub_y, ub_y, lb_y, lb_y])

        map.plot(box_xs, box_ys, '#660099')

        axins = zoomed_inset_axes(pylab.gca(), 4, loc=4)
        pylab.sca(axins)

        pylab.contourf(xs[box],
                       ys[box],
                       refl[box],
                       levels=np.arange(10, 80, 10))
        pylab.contour(xs[box],
                      ys[box],
                      w[box],
                      levels=np.arange(-10, 0, 2),
                      colors='#666666',
                      style='--')
        pylab.contour(xs[box],
                      ys[box],
                      w[box],
                      levels=np.arange(2, 12, 2),
                      colors='#666666',
                      style='-')
        pylab.quiver(xs[box], ys[box], u[box], v[box])

        drawPolitical(map)

        pylab.xlim([lb_x * gs_x, ub_x * gs_x - 1])
        pylab.ylim([lb_y * gs_y, ub_y * gs_y - 1])

        mark_inset(axmain, axins, loc1=1, loc2=3, fc='none', ec='k')

    pylab.sca(axmain)
    drawPolitical(map)

    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #14
0
ファイル: ets.py プロジェクト: tsupinie/research
def plotConfusion(confusion, map, grid_spacing, title, file_name, inset=None, fudge=16):
    pylab.figure()
    axmain = pylab.axes()
    gs_x, gs_y = grid_spacing

    confusion_cmap_dict = {
        'red':(
            (0.0,  0.5, 0.5), 
            (0.25, 0.5, 1.0),
            (0.5,  1.0, 0.0),
            (0.75, 0.0, 1.0),
            (1.0,  1.0, 1.0),
        ),
        'green':(
            (0.0,  0.5, 0.5), 
            (0.25, 0.5, 0.0),
            (0.5,  0.0, 1.0),
            (0.75, 1.0, 1.0),
            (1.0,  1.0, 1.0),
        ),
        'blue':(
            (0.0,  0.5, 0.5), 
            (0.25, 0.5, 1.0),
            (0.5,  1.0, 0.0),
            (0.75, 0.0, 1.0),
            (1.0,  1.0, 1.0),
        ),
    }
    confusion_cmap = LinearSegmentedColormap('confusion', confusion_cmap_dict, 256)

    nx, ny = confusion.shape
    xs, ys = np.meshgrid( gs_x * np.arange(nx), gs_y * np.arange(ny) )

    pylab.pcolormesh(xs, ys, confusion, cmap=confusion_cmap, vmin=0, vmax=3)

    tick_locs = [ 0.375 + 0.75 * l for l in  range(4) ]
    tick_labels = [ "Correct\nNegative", "False\nAlarm", "Miss", "Hit" ]
    bar = pylab.colorbar()
    bar.locator = FixedLocator(tick_locs)
    bar.formatter = FixedFormatter(tick_labels)
    pylab.setp(pylab.getp(bar.ax, 'ymajorticklabels'), fontsize='large')
    bar.update_ticks()

    drawPolitical(map, scale_len=25)

    if inset:
        lb_y, lb_x = [ b.start for b in inset ]
        ub_y, ub_x = [ b.stop + fudge for b in inset ]

        inset_exp = (slice(lb_y, ub_y), slice(lb_x, ub_x))

        axins = zoomed_inset_axes(pylab.gca(), 2, loc=4)
        pylab.sca(axins)

        pylab.pcolormesh(xs[inset_exp], ys[inset_exp], confusion[inset_exp], cmap=confusion_cmap, vmin=0, vmax=3)
        drawPolitical(map)

        pylab.xlim([lb_x * gs_x, (ub_x - 1) * gs_x])
        pylab.ylim([lb_y * gs_y, (ub_y - 1) * gs_y])

        mark_inset(axmain, axins, loc1=1, loc2=3, fc='none', ec='k')

    pylab.sca(axmain)
    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #15
0
ファイル: plot_assim_obs.py プロジェクト: tsupinie/research
def plotSoundingObservationsComposite(obs, map, scale_len, dimensions, title, file_name, radars=None):
    figure = pylab.figure(figsize=(10,8))
    x_size, y_size = dimensions

    grid_spec = GridSpec(2, 2, width_ratios=[3, 1], height_ratios=[1, 3])

    colors = [ 'r', 'g', 'b', 'c', 'm', '#660099', '#006666', '#99ff00', '#ff9900', '#666666' ]
    names = [ "Sounding (NSSL)", "Sounding (NCAR)", "Sounding (NCAR)", "Sounding (NCAR)", "Sounding (NSSL)", "Sounding (NSSL)" ]
    ob_ids = np.unique1d(obs['id'])

    bottom = 0.075
    top = 0.95
    stretch_fac = (1 - top + bottom) / 2. - 0.011

    pylab.subplots_adjust(left=0.1 + stretch_fac, bottom=bottom, right=0.9 - stretch_fac, top=top, hspace=0.075, wspace=0.075)

    ax_xy = figure.add_subplot(grid_spec[2])
    ax_xz = figure.add_subplot(grid_spec[0], sharex=ax_xy)
    ax_yz = figure.add_subplot(grid_spec[3], sharey=ax_xy)

    def labelMe(do_label, label):
        if do_label:
            return not do_label, label
        else:
            return do_label, None

    color_num = 0
    prof_label = True
    sfc_label = True
    asos_label = True
    ttu_label = True

    for ob_id in ob_ids:
        plot_vertical = False
        ob_idxs = np.where(obs['id'] == ob_id)[0]
        these_obs = obs[ob_idxs]
        ob_xs, ob_ys = map(these_obs['longitude'], these_obs['latitude'])

        if np.any(ob_xs >= 0) and np.any(ob_xs <= x_size) and np.any(ob_ys >= 0) and np.any(ob_ys <= y_size):
            if these_obs['obtype'][0] == "PROF":
                prof_label, label = labelMe(prof_label, "Profiler")
                color = "#ff9900"
                marker = 'o'
                ms = 3
                plot_vertical = True
            elif these_obs['obtype'][0] == "SNDG":
                color = colors[color_num]
                label = "Sounding"# % ob_id
                marker = 'o'
                ms = 3
                plot_vertical = True
                color_num += 1               
            elif ob_id[0] == "P":
                color = "#999999"
                sfc_label, label = labelMe(sfc_label, "Sounding")
                marker = 'o'
                ms = 3
            elif ob_id[0] == "K":
                asos_label, label = labelMe(asos_label, "ASOS")
                color = 'k'
                marker = '*'
                ms = 5
            elif ob_id[0] == "1" or ob_id[0] == "2":
                ttu_label, label = labelMe(ttu_label, "TTU Sticknet")
                color = "#003300"
                marker = 'o'
                ms = 3

            ax_xy.plot(ob_xs, ob_ys, marker, mfc=color, mec=color, ms=ms, label=label)[0]
            if plot_vertical:
                ax_xz.plot(ob_xs, these_obs['elevation'] / 1000., marker, mfc=color, mec=color, ms=ms)
                ax_yz.plot(these_obs['elevation'] / 1000., ob_ys, marker, mfc=color, mec=color, ms=ms)

    dummy, zlim = ax_xz.get_ylim()

    for ob_id in ob_ids:
        ob_idxs = np.where(obs['id'] == ob_id)[0]
        these_obs = obs[ob_idxs]
        ob_xs, ob_ys = map(these_obs['longitude'], these_obs['latitude'])

        plot_vertical = False

        if np.any(ob_xs >= 0) and np.any(ob_xs <= x_size) and np.any(ob_ys >= 0) and np.any(ob_ys <= y_size):
            if these_obs['obtype'][0] == "PROF":
                color = "#ff9900"
                plot_vertical = True
            elif these_obs['obtype'][0] == "SNDG":
                color = "#999999"
                plot_vertical = True

            if plot_vertical:
                ax_xy.plot(ob_xs[0], ob_ys[0], 'x', color=color, ms=6)
                ax_xz.plot([ob_xs[0], ob_xs[0]], [0, zlim], '--', color=color, lw=0.5)
                ax_yz.plot([0, zlim], [ob_ys[0], ob_ys[0]], '--', color=color, lw=0.5)

    if radars:
        rad_label = True
        for radar in radars:
            rad_label, label = labelMe(rad_label, "Radar")
            (lat, lon), range = radar
            radar_x, radar_y = map(lon, lat)
            ax_xy.plot(radar_x, radar_y, 'b<', ms=4, label=label)
            ax_xy.add_patch(Circle((radar_x, radar_y), range, fc='none', ec='k'))

    ax_xz.set_ylim(0, zlim)
    ax_yz.set_xlim(0, zlim)

    pylab.sca(ax_xy)
    drawPolitical(map, scale_len=scale_len)

    ax_xz.set_xlabel("x")
    ax_xz.set_ylabel("z (km)")
    ax_yz.set_xlabel("z (km)")
    ax_yz.set_ylabel("y", rotation=-90)

    line_objects = [ l for l in sorted(ax_xy.lines, key=lambda x: x.get_label()) if l.get_label()[0] != "_" ]
    ax_xy.legend(line_objects, [ l.get_label() for l in line_objects], loc=1, numpoints=1, ncol=2, prop={'size':'medium'}, bbox_to_anchor=(1.28, 1.07, 0.33, 0.33), handletextpad=0, columnspacing=0)

    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #16
0
def plotConfusion(confusion,
                  map,
                  grid_spacing,
                  title,
                  file_name,
                  inset=None,
                  fudge=16):
    pylab.figure()
    axmain = pylab.axes()
    gs_x, gs_y = grid_spacing

    confusion_cmap_dict = {
        'red': (
            (0.0, 0.5, 0.5),
            (0.25, 0.5, 1.0),
            (0.5, 1.0, 0.0),
            (0.75, 0.0, 1.0),
            (1.0, 1.0, 1.0),
        ),
        'green': (
            (0.0, 0.5, 0.5),
            (0.25, 0.5, 0.0),
            (0.5, 0.0, 1.0),
            (0.75, 1.0, 1.0),
            (1.0, 1.0, 1.0),
        ),
        'blue': (
            (0.0, 0.5, 0.5),
            (0.25, 0.5, 1.0),
            (0.5, 1.0, 0.0),
            (0.75, 0.0, 1.0),
            (1.0, 1.0, 1.0),
        ),
    }
    confusion_cmap = LinearSegmentedColormap('confusion', confusion_cmap_dict,
                                             256)

    nx, ny = confusion.shape
    xs, ys = np.meshgrid(gs_x * np.arange(nx), gs_y * np.arange(ny))

    pylab.pcolormesh(xs, ys, confusion, cmap=confusion_cmap, vmin=0, vmax=3)

    tick_locs = [0.375 + 0.75 * l for l in range(4)]
    tick_labels = ["Correct\nNegative", "False\nAlarm", "Miss", "Hit"]
    bar = pylab.colorbar()
    bar.locator = FixedLocator(tick_locs)
    bar.formatter = FixedFormatter(tick_labels)
    pylab.setp(pylab.getp(bar.ax, 'ymajorticklabels'), fontsize='large')
    bar.update_ticks()

    drawPolitical(map, scale_len=25)

    if inset:
        lb_y, lb_x = [b.start for b in inset]
        ub_y, ub_x = [b.stop + fudge for b in inset]

        inset_exp = (slice(lb_y, ub_y), slice(lb_x, ub_x))

        axins = zoomed_inset_axes(pylab.gca(), 2, loc=4)
        pylab.sca(axins)

        pylab.pcolormesh(xs[inset_exp],
                         ys[inset_exp],
                         confusion[inset_exp],
                         cmap=confusion_cmap,
                         vmin=0,
                         vmax=3)
        drawPolitical(map)

        pylab.xlim([lb_x * gs_x, (ub_x - 1) * gs_x])
        pylab.ylim([lb_y * gs_y, (ub_y - 1) * gs_y])

        mark_inset(axmain, axins, loc1=1, loc2=3, fc='none', ec='k')

    pylab.sca(axmain)
    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #17
0
def plotObservationsComposite(obs, map, scale_len, title, file_name):
    pylab.figure(figsize=(10, 8))
    pylab.axes((0, 0, 1, 0.95))
    colors = ['r', 'g', 'b', 'c', 'm', '#660099', '#ff9900', '#006666']

    ob_ids = np.unique1d(obs['id'])
    ttu_label = False
    asos_label = False
    sndg_label = False

    for ob_id in ob_ids:
        ob_idxs = np.where(obs['id'] == ob_id)[0]
        these_obs = obs[ob_idxs]
        ob_xs, ob_ys = map(these_obs['longitude'], these_obs['latitude'])

        if ob_id[0] == "P":
            ob_num = int(ob_id[1]) - 1
            pylab.plot(ob_xs,
                       ob_ys,
                       'o',
                       mfc=colors[ob_num],
                       mec=colors[ob_num],
                       ms=3,
                       label="NSSL MM (%s)" % ob_id)
        elif ob_id[0] == "K":
            if not asos_label:
                label = "ASOS"
                asos_label = True
            else:
                label = None

            pylab.plot(ob_xs[0], ob_ys[0], 'k*', ms=5, label=label)
        elif ob_id[0] == "1" or ob_id[0] == "2":
            if not ttu_label:
                label = "TTU Sticknet"
                ttu_label = True
            else:
                label = None

            pylab.plot(ob_xs[0],
                       ob_ys[0],
                       'o',
                       mfc="#999999",
                       mec="#999999",
                       ms=3,
                       label=label)
        elif these_obs[0]['obtype'] == "SNDG":
            if not sndg_label:
                label = "Sounding"
                sndg_label = True
            else:
                label = None

            pylab.plot(ob_xs[0], ob_ys[0], 'k^', ms=4, label=label)

    drawPolitical(map, scale_len=scale_len)

    line_objects = [
        l for l in sorted(pylab.gca().lines, key=lambda x: x.get_label())
        if l.get_label()[0] != "_"
    ]
    pylab.legend(line_objects, [l.get_label() for l in line_objects],
                 loc=2,
                 numpoints=1,
                 prop={'size': 'medium'})
    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #18
0
def plotSoundingObservationsComposite(obs,
                                      map,
                                      scale_len,
                                      dimensions,
                                      title,
                                      file_name,
                                      radars=None):
    figure = pylab.figure(figsize=(10, 8))
    x_size, y_size = dimensions

    grid_spec = GridSpec(2, 2, width_ratios=[3, 1], height_ratios=[1, 3])

    colors = [
        'r', 'g', 'b', 'c', 'm', '#660099', '#006666', '#99ff00', '#ff9900',
        '#666666'
    ]
    names = [
        "Sounding (NSSL)", "Sounding (NCAR)", "Sounding (NCAR)",
        "Sounding (NCAR)", "Sounding (NSSL)", "Sounding (NSSL)"
    ]
    ob_ids = np.unique1d(obs['id'])

    bottom = 0.075
    top = 0.95
    stretch_fac = (1 - top + bottom) / 2. - 0.011

    pylab.subplots_adjust(left=0.1 + stretch_fac,
                          bottom=bottom,
                          right=0.9 - stretch_fac,
                          top=top,
                          hspace=0.075,
                          wspace=0.075)

    ax_xy = figure.add_subplot(grid_spec[2])
    ax_xz = figure.add_subplot(grid_spec[0], sharex=ax_xy)
    ax_yz = figure.add_subplot(grid_spec[3], sharey=ax_xy)

    def labelMe(do_label, label):
        if do_label:
            return not do_label, label
        else:
            return do_label, None

    color_num = 0
    prof_label = True
    sfc_label = True
    asos_label = True
    ttu_label = True

    for ob_id in ob_ids:
        plot_vertical = False
        ob_idxs = np.where(obs['id'] == ob_id)[0]
        these_obs = obs[ob_idxs]
        ob_xs, ob_ys = map(these_obs['longitude'], these_obs['latitude'])

        if np.any(ob_xs >= 0) and np.any(ob_xs <= x_size) and np.any(
                ob_ys >= 0) and np.any(ob_ys <= y_size):
            if these_obs['obtype'][0] == "PROF":
                prof_label, label = labelMe(prof_label, "Profiler")
                color = "#ff9900"
                marker = 'o'
                ms = 3
                plot_vertical = True
            elif these_obs['obtype'][0] == "SNDG":
                color = colors[color_num]
                label = "Sounding"  # % ob_id
                marker = 'o'
                ms = 3
                plot_vertical = True
                color_num += 1
            elif ob_id[0] == "P":
                color = "#999999"
                sfc_label, label = labelMe(sfc_label, "Sounding")
                marker = 'o'
                ms = 3
            elif ob_id[0] == "K":
                asos_label, label = labelMe(asos_label, "ASOS")
                color = 'k'
                marker = '*'
                ms = 5
            elif ob_id[0] == "1" or ob_id[0] == "2":
                ttu_label, label = labelMe(ttu_label, "TTU Sticknet")
                color = "#003300"
                marker = 'o'
                ms = 3

            ax_xy.plot(ob_xs,
                       ob_ys,
                       marker,
                       mfc=color,
                       mec=color,
                       ms=ms,
                       label=label)[0]
            if plot_vertical:
                ax_xz.plot(ob_xs,
                           these_obs['elevation'] / 1000.,
                           marker,
                           mfc=color,
                           mec=color,
                           ms=ms)
                ax_yz.plot(these_obs['elevation'] / 1000.,
                           ob_ys,
                           marker,
                           mfc=color,
                           mec=color,
                           ms=ms)

    dummy, zlim = ax_xz.get_ylim()

    for ob_id in ob_ids:
        ob_idxs = np.where(obs['id'] == ob_id)[0]
        these_obs = obs[ob_idxs]
        ob_xs, ob_ys = map(these_obs['longitude'], these_obs['latitude'])

        plot_vertical = False

        if np.any(ob_xs >= 0) and np.any(ob_xs <= x_size) and np.any(
                ob_ys >= 0) and np.any(ob_ys <= y_size):
            if these_obs['obtype'][0] == "PROF":
                color = "#ff9900"
                plot_vertical = True
            elif these_obs['obtype'][0] == "SNDG":
                color = "#999999"
                plot_vertical = True

            if plot_vertical:
                ax_xy.plot(ob_xs[0], ob_ys[0], 'x', color=color, ms=6)
                ax_xz.plot([ob_xs[0], ob_xs[0]], [0, zlim],
                           '--',
                           color=color,
                           lw=0.5)
                ax_yz.plot([0, zlim], [ob_ys[0], ob_ys[0]],
                           '--',
                           color=color,
                           lw=0.5)

    if radars:
        rad_label = True
        for radar in radars:
            rad_label, label = labelMe(rad_label, "Radar")
            (lat, lon), range = radar
            radar_x, radar_y = map(lon, lat)
            ax_xy.plot(radar_x, radar_y, 'b<', ms=4, label=label)
            ax_xy.add_patch(
                Circle((radar_x, radar_y), range, fc='none', ec='k'))

    ax_xz.set_ylim(0, zlim)
    ax_yz.set_xlim(0, zlim)

    pylab.sca(ax_xy)
    drawPolitical(map, scale_len=scale_len)

    ax_xz.set_xlabel("x")
    ax_xz.set_ylabel("z (km)")
    ax_yz.set_xlabel("z (km)")
    ax_yz.set_ylabel("y", rotation=-90)

    line_objects = [
        l for l in sorted(ax_xy.lines, key=lambda x: x.get_label())
        if l.get_label()[0] != "_"
    ]
    ax_xy.legend(line_objects, [l.get_label() for l in line_objects],
                 loc=1,
                 numpoints=1,
                 ncol=2,
                 prop={'size': 'medium'},
                 bbox_to_anchor=(1.28, 1.07, 0.33, 0.33),
                 handletextpad=0,
                 columnspacing=0)

    pylab.suptitle(title)
    pylab.savefig(file_name)
    pylab.close()
    return
コード例 #19
0
def main():
    base_time = datetime(2009, 6, 5, 18, 0, 0)
    epoch = datetime(1970, 1, 1, 0, 0, 0)
    base_epoch = (base_time - epoch).total_seconds()
    times_seconds = range(14700, 18300, 300)
    times = [base_time + timedelta(seconds=t) for t in times_seconds]

    bounds = (slice(100, 180), slice(90, 170))
    rev_bounds = [0]
    rev_bounds.extend(bounds[::-1])
    rev_bounds = tuple(rev_bounds)

    proj = setupMapProjection(goshen_1km_proj, goshen_1km_gs, bounds=bounds)
    map = Basemap(**proj)

    obs_file_names = [
        'psu_straka_mesonet.pkl', 'ttu_sticknet.pkl', 'asos.pkl',
        'soundings_clip.pkl'
    ]
    all_obs = loadObs(obs_file_names,
                      times,
                      map,
                      (goshen_1km_proj['width'], goshen_1km_proj['height']),
                      sounding_obs=['soundings_clip.pkl'])

    refl_base = "hdf/KCYS/1km/goshen.hdfrefl2d"
    refl_times = np.array(
        [int(f[-6:]) for f in glob.glob("%s??????" % refl_base)])
    refl_keep_times = []
    refl_data = {}

    for tt in times_seconds:
        idx = np.argmin(np.abs(refl_times - tt))
        if refl_times[idx] > tt and idx > 0:
            idx -= 1

        file_name = "%s%06d" % (refl_base, refl_times[idx])
        hdf = nio.open_file(file_name, mode='r', format='hdf')
        refl_keep_times.append(refl_times[idx])
        refl_data[tt] = hdf.variables['refl2d'][rev_bounds]

    for time, reg in inflow_stations.iteritems():
        pylab.figure()

        gs_x, gs_y = goshen_1km_gs
        nx, ny = refl_data[time].shape
        xs, ys = np.meshgrid(gs_x * np.arange(nx), gs_y * np.arange(ny))
        pylab.contourf(xs, ys, refl_data[time], levels=np.arange(10, 80, 10))

        for region, stations in reg.iteritems():
            if region != 'sounding':
                for station in stations:
                    idxs = np.where((all_obs['id'] == station)
                                    & (all_obs['time'] == base_epoch + time))
                    ob_xs, ob_ys = map(all_obs['longitude'][idxs],
                                       all_obs['latitude'][idxs])

                    if region == 'inflow': color = 'r'
                    elif region == 'outflow': color = 'b'

                    wdir = all_obs['wind_dir'][idxs]
                    wspd = all_obs['wind_spd'][idxs]
                    u = -wspd * np.sin(wdir * np.pi / 180.) * 1.94
                    v = -wspd * np.cos(wdir * np.pi / 180.) * 1.94

                    pylab.plot(ob_xs, ob_ys, "%so" % color)
                    pylab.barbs(ob_xs, ob_ys, u, v)

        drawPolitical(map, scale_len=10)

        pylab.savefig("inflow_stations_%06d.png" % time)
        pylab.close()

    return
コード例 #20
0
ファイル: plot.py プロジェクト: tsupinie/research
def plot_map(radar_data, grid_spacing, title, file_name, color_bar='refl', topo=None, aux_field=None, vectors=None, obs=None):
#   bounds = (slice(80, 160), slice(90, 170))
    bounds = (slice(None), slice(None))
#   bounds = (slice(242, 327), slice(199, 284))
    pylab.figure()
    pylab.subplots_adjust(left=0.02, right=0.98, top=0.90, bottom=0.02)
    nx, ny = radar_data[bounds[::-1]].shape

    proj = setupMapProjection(goshen_1km_proj, goshen_1km_gs, bounds=bounds)
    map = Basemap(**proj)

    radar_x, radar_y = map([-104.299004], [41.561497])

    if topo is not None:
        topo_data, topo_lats, topo_lons = topo

        topo_lats, topo_lons = np.meshgrid(topo_lats, topo_lons)
        topo_x, topo_y = map(topo_lons, topo_lats)

        map.contourf(topo_x, topo_y, topo_data, cmap=pylab.get_cmap('gray'))

    if color_bar == 'refl':
        levels = range(10, 85, 5)
        color_map = NWSRef #pylab.get_cmap('jet')
    elif color_bar == 'radv':
        levels = range(-35, 40, 5)
        color_map = pylab.get_cmap('RdBu')
    elif color_bar == 'pt':
        levels = range(296, 321, 2)
        color_map = pylab.get_cmap('jet')

    print nx, ny

    x, y = np.meshgrid(grid_spacing * np.arange(nx), grid_spacing * np.arange(ny))

    map.contourf(x, y, radar_data[bounds[::-1]], levels=levels, cmap=color_map)
#   map.plot(radar_x, radar_y, 'ko')
    pylab.colorbar()

    if aux_field is not None:
        aux_levels, aux_data = aux_field
        CS = map.contour(x, y, aux_data[bounds[::-1]], levels=aux_levels, colors='k', lw=0.75)
#       pylab.clabel(CS, fmt='%.0f', inline_spacing=1, fontsize="12px")

    drawPolitical(map, scale_len=25)

    if obs is not None:
        for stid, ob in obs.iteritems():
            potential_temperature = (5. / 9. * (ob['temperature'] - 32) + 273.15) * (29.5250192 / ob['pressure']) ** (2. / 7.)
            ob_x, ob_y = map(ob['Longitude'], ob['Latitude'])

            ob_ax_x, ob_ax_y = (pylab.gca().transData + pylab.gca().transAxes.inverted()).transform(np.array([ob_x, ob_y]))

            if ob_ax_x > 0 and ob_ax_x <= 1 and ob_ax_y > 0 and ob_ax_y <= 1:
                pylab.gca().add_patch(Circle((ob_x, ob_y), 4000, fc='none', ec='k'))
                pylab.text(ob_x, ob_y, "%5.1f" % potential_temperature, size='x-small', ha='right', va='bottom')

    if vectors is not None:
        stride = 4
        u, v = vectors
        pylab.quiver(x[::stride, ::stride], y[::stride, ::stride], u[::stride, ::stride], v[::stride, ::stride])

    pylab.title(title)
    pylab.savefig(file_name)
    return
コード例 #21
0
def plot_map(radar_data,
             grid_spacing,
             title,
             file_name,
             color_bar='refl',
             topo=None,
             aux_field=None,
             vectors=None,
             obs=None):
    #   bounds = (slice(80, 160), slice(90, 170))
    bounds = (slice(None), slice(None))
    #   bounds = (slice(242, 327), slice(199, 284))
    pylab.figure()
    pylab.subplots_adjust(left=0.02, right=0.98, top=0.90, bottom=0.02)
    nx, ny = radar_data[bounds[::-1]].shape

    proj = setupMapProjection(goshen_1km_proj, goshen_1km_gs, bounds=bounds)
    map = Basemap(**proj)

    radar_x, radar_y = map([-104.299004], [41.561497])

    if topo is not None:
        topo_data, topo_lats, topo_lons = topo

        topo_lats, topo_lons = np.meshgrid(topo_lats, topo_lons)
        topo_x, topo_y = map(topo_lons, topo_lats)

        map.contourf(topo_x, topo_y, topo_data, cmap=pylab.get_cmap('gray'))

    if color_bar == 'refl':
        levels = range(10, 85, 5)
        color_map = NWSRef  #pylab.get_cmap('jet')
    elif color_bar == 'radv':
        levels = range(-35, 40, 5)
        color_map = pylab.get_cmap('RdBu')
    elif color_bar == 'pt':
        levels = range(296, 321, 2)
        color_map = pylab.get_cmap('jet')

    print nx, ny

    x, y = np.meshgrid(grid_spacing * np.arange(nx),
                       grid_spacing * np.arange(ny))

    map.contourf(x, y, radar_data[bounds[::-1]], levels=levels, cmap=color_map)
    #   map.plot(radar_x, radar_y, 'ko')
    pylab.colorbar()

    if aux_field is not None:
        aux_levels, aux_data = aux_field
        CS = map.contour(x,
                         y,
                         aux_data[bounds[::-1]],
                         levels=aux_levels,
                         colors='k',
                         lw=0.75)


#       pylab.clabel(CS, fmt='%.0f', inline_spacing=1, fontsize="12px")

    drawPolitical(map, scale_len=25)

    if obs is not None:
        for stid, ob in obs.iteritems():
            potential_temperature = (5. / 9. * (ob['temperature'] - 32) +
                                     273.15) * (29.5250192 /
                                                ob['pressure'])**(2. / 7.)
            ob_x, ob_y = map(ob['Longitude'], ob['Latitude'])

            ob_ax_x, ob_ax_y = (pylab.gca().transData +
                                pylab.gca().transAxes.inverted()).transform(
                                    np.array([ob_x, ob_y]))

            if ob_ax_x > 0 and ob_ax_x <= 1 and ob_ax_y > 0 and ob_ax_y <= 1:
                pylab.gca().add_patch(
                    Circle((ob_x, ob_y), 4000, fc='none', ec='k'))
                pylab.text(ob_x,
                           ob_y,
                           "%5.1f" % potential_temperature,
                           size='x-small',
                           ha='right',
                           va='bottom')

    if vectors is not None:
        stride = 4
        u, v = vectors
        pylab.quiver(x[::stride, ::stride], y[::stride, ::stride],
                     u[::stride, ::stride], v[::stride, ::stride])

    pylab.title(title)
    pylab.savefig(file_name)
    return