NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.

To learn about what's going on, see About the Archive Site.

Re: [python-users] Help me Surface Charts

Alexander :

Attached is a little "command line" python script I wrote.  It uses
xarray and metpy.declarative.

You can make a MSL chart by running it as :

python xarray-declarative-2.py --nwpfield Pressure_reduced_to_MSL_msl -a opcahsf

... or "500 mb" chart with :

python xarray-declarative-2.py -f Geopotential_height_isobaric -l '500
hPa' -a opcahsf

The default is to make a chart closest to the current time.  You can
specify the "--reftime" with a command line option.  If you specify in
the future, it will use a forecast. For example :

python xarray-declarative-2.py --nwpfield Pressure_reduced_to_MSL_msl
-a opcahsf --reftime 2021-08-23T00:00

It uses the thredds "Best" time to get the most "best" reftime and
valid time.  There is a poster that explains this ... which I can't
seem to find right now.

Sorry ... I don't print the reftime / valid time on the plot.  I can
try to figure that out if you want.

Thanks,
Ken

On Tue, Aug 24, 2021 at 1:00 PM Alexander Martínez
<almmartinezme@xxxxxxxxx> wrote:
>
> Hello.I made an example of the surface chart linking 
> https://github.com/Unidata/python-training/blob/master/pages/gallery/HILO_Symbol_Plot.ipynb,
>  but the Thredds catalog has data from 2014 and not data from August 2021. I 
> also have problems with the pressure levels because the colors of the high 
> and low pressures are not displayed.
>
> Could you please show me an example of a surface chart for the area, but with 
> data from August 23?
>
> Thank you very much for your collaboration and I remain attentive to your 
> instructions.
>
>
>
> --
> Alexander M. Martínez Mercado
> Lic. en Química
> Universidad Distrital Francisco José de Caldas
> MSc en Ciencias - Meteorología
> Universidad Nacional de Colombia
> Docente MT UECCI
> OSPA - IDEAM
> _______________________________________________
> NOTE: All exchanges posted to Unidata maintained email lists are
> recorded in the Unidata inquiry tracking system and made publicly
> available through the web.  Users who post to any of the lists we
> maintain are reminded to remove any personal information that they
> do not want to be made public.
>
>
> python-users mailing list
> python-users@xxxxxxxxxxxxxxxx
> For list information, to unsubscribe, or change your membership options, 
> visit: https://www.unidata.ucar.edu/mailing_lists/
#!/usr/bin/python3

# plot with "metpy declarative"

# usage :
# python xarray-declarative-2.py -f Pressure_reduced_to_MSL_msl -a opcahsf
# python xarray-declarative-2.py -f Geopotential_height_isobaric -l '500 hPa'

# on Fedora :
#   dnf install python3-xarray python3-cartopy
#   pip install metpy

#############################################################

import xarray
import metpy

def proc0(args1):
    #print('=== args1 : ', args1)

    args0 = vars(args1) # usings vars() to create dict
    print('=== args0 : ', args0)

    ########################

    if args0['level'] is None:
        lev1 = None
    else:
        s0 = args0['level'].split()
        lev1 = int(s0[0]) * metpy.units.units(s0[1])

    ########################

    import datetime

    if args0['reftime'] is not None:
        reftime0 = datetime.datetime.strptime(args0['reftime'], 
'%Y-%m-%dT%H:%M')
    else:
        reftime0 = datetime.datetime.utcnow()

    vtime0 = reftime0 + datetime.timedelta(hours=int(args0['valid'])) # 
forecast time / valid time

    ########################

    n1 = args0['nwpmodel']
    url0 = f'https://thredds.ucar.edu/thredds/dodsC/grib/NCEP/{n1}/Best'
    xdsnwp0 = xarray.open_dataset(url0)
    #print(xdsnwp0)

    from metpy.plots import declarative

    panel0 = declarative.MapPanel()

    ######################################### plot NWP data

    # Set Contour Plot Parameters
    #contour0 = declarative.FilledContourPlot()
    contour0 = declarative.ContourPlot()
    contour0.data = xdsnwp0
    contour0.time = vtime0
    contour0.field = args0['nwpfield']
    contour0.level = lev1

    contour0.clabels = True
    contour0.linecolor = 'blue'
    contour0.linewidth = 1

    v0 = contour0.data[contour0.field]
    print(v0)

    #if args0['unit'] is not None:
        #v0.metpy.convert_units(args0['unit']) # XXX broken ?? slow

    panel0.title += f'{n1} '
    panel0.title += f'{v0.name}'
    if contour0.level is not None:
        panel0.title += f'@{contour0.level}'
    panel0.title += " [{}]".format(v0.attrs["units"])

    #panel0.title += '\n' ###################
    #panel0.title += xarray.core.formatting.format_item(v0.reftime.values)

    #########################################

    panel0.area = args0['area'] # XXX default : max of all plots ?? see 
metpy/plots/declarative.py : _areas
    if args0['proj'] is not None:
        panel0.projection = args0['proj'] # XXX default : proj of first plot

    import cartopy.feature

    panel0.layers = [cartopy.feature.COASTLINE]#(edgecolor='white')]

    panel0.plots = [contour0]

    pc0 = declarative.PanelContainer()
    pc0.panels = [panel0]

    pc0.show()
    #pc0.save(f'fn_{dt:%Y%m%d_%H%MZ}.{ext}', dpi=200, bbox_inches='tight')
    # del pc0


def main():
    import argparse
    parser = argparse.ArgumentParser(description="get point data")
    parser.add_argument("-m", "--nwpmodel", default = 'GFS/Global_onedeg', 
help="NWP model")
    parser.add_argument("-f", "--nwpfield", default = 
'Pressure_reduced_to_MSL_msl', help="field")
    parser.add_argument("-a", "--area", default = None, type = str, help="area")
    parser.add_argument("-p", "--proj", help="projection", default = None, type 
= str)
    #parser.add_argument("-u", "--unit", default = None , help="plot units", 
type = str)
    # -u knot
    # -u hPa
    parser.add_argument("-l", "--level", default = None , help="level", type = 
str)
    # -l '500 hPa'
    parser.add_argument("-t", "--reftime", default = None, help="ref time : 
%Y-%m-%dT%H:%M")
    parser.add_argument("-v", "--valid", default = 0, type = int, help="valid 
time (hours)")
    proc0(parser.parse_args())

import sys
if __name__ == '__main__':
    sys.exit(main())
  • 2021 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the python-users archives: