"""pyrad.graph.plots_aux=====================Auxiliary plotting functions.. autosummary:: :toctree: generated/ generate_complex_range_Doppler_title generate_angle_Doppler_title generate_complex_Doppler_title generate_fixed_rng_span_title generate_fixed_rng_title generate_dda_map_title generate_dda_latitude_slice_title generate_dda_longitude_slice_title get_colobar_label get_field_name get_norm"""importnumpyasnpimportpyartimportmatplotlibasmplimportmatplotlib.cmmpl.use("Agg")# Increase a bit font sizempl.rcParams.update({"font.size":16})mpl.rcParams.update({"font.family":"sans-serif"})defgenerate_complex_range_Doppler_title(radar,field,ray,datetime_format=None):""" creates the fixed range plot title Parameters ---------- radar : radar The radar object field : str name of the field stat : str The statistic computed datetime_forat : str or None The date time format to use Returns ------- titl : str The plot title """begin_time=pyart.graph.common.generate_radar_time_begin(radar)ifdatetime_format:time_str=begin_time.strftime(datetime_format)else:time_str=begin_time.isoformat()+"Z"l1="%s azi%.1f-ele%.1f deg. %s "%(pyart.graph.common.generate_radar_name(radar),radar.azimuth["data"][ray],radar.elevation["data"][ray],time_str,)field_name=pyart.graph.common.generate_field_name(radar,field)returnl1+"\n"+field_namedefgenerate_angle_Doppler_title(radar,field,ang,ind_rng,along_azi=True,datetime_format=None):""" creates the angle-Doppler plot title Parameters ---------- radar : radar The radar object field : str name of the field ang : float The fixed angle ind_rng : int the index of the fixed range along_azi : bool If true the plot is performed along azimuth, otherwise it is performed along elevation datetime_forat : str or None The date time format to use Returns ------- titl : str The plot title """begin_time=pyart.graph.common.generate_radar_time_begin(radar)ifdatetime_format:time_str=begin_time.strftime(datetime_format)else:time_str=begin_time.isoformat()+"Z"ifalong_azi:ang_type="ele"else:ang_type="azi"l1="%s%s%.1f deg-rng%.1f m. %s "%(pyart.graph.common.generate_radar_name(radar),ang_type,ang,radar.range["data"][ind_rng],time_str,)field_name=pyart.graph.common.generate_field_name(radar,field)returnl1+"\n"+field_namedefgenerate_complex_Doppler_title(radar,field,ray,rng,datetime_format=None):""" creates the fixed range plot title Parameters ---------- radar : radar The radar object field : str name of the field stat : str The statistic computed datetime_forat : str or None The date time format to use Returns ------- titl : str The plot title """begin_time=pyart.graph.common.generate_radar_time_begin(radar)ifdatetime_format:time_str=begin_time.strftime(datetime_format)else:time_str=begin_time.isoformat()+"Z"l1="%s azi%.1f-ele%.1f deg rng%.1f km. %s "%(pyart.graph.common.generate_radar_name(radar),radar.azimuth["data"][ray],radar.elevation["data"][ray],radar.range["data"][rng]/1000.0,time_str,)field_name=pyart.graph.common.generate_field_name(radar,field)returnl1+"\n"+field_namedefgenerate_fixed_rng_span_title(radar,field,stat,datetime_format=None):""" creates the fixed range plot title Parameters ---------- radar : radar The radar object field : str name of the field stat : str The statistic computed datetime_forat : str or None The date time format to use Returns ------- titl : str The plot title """begin_time=pyart.graph.common.generate_radar_time_begin(radar)ifdatetime_format:time_str=begin_time.strftime(datetime_format)else:time_str=begin_time.isoformat()+"Z"l1="%s%.1f-%.1f m %s. %s "%(pyart.graph.common.generate_radar_name(radar),np.min(radar.range["data"]),np.max(radar.range["data"]),stat,time_str,)field_name=pyart.graph.common.generate_field_name(radar,field)returnl1+"\n"+field_namedefgenerate_fixed_rng_title(radar,field,fixed_rng,datetime_format=None):""" creates the fixed range plot title Parameters ---------- radar : radar The radar object field : str name of the field fixed_rng : float The fixed range [m] datetime_forat : str or None The date time format to use Returns ------- titl : str The plot title """begin_time=pyart.graph.common.generate_radar_time_begin(radar)ifdatetime_format:time_str=begin_time.strftime(datetime_format)else:time_str=begin_time.isoformat()+"Z"l1="%s%.1f m. %s "%(pyart.graph.common.generate_radar_name(radar),fixed_rng,time_str,)field_name=pyart.graph.common.generate_field_name(radar,field)returnl1+"\n"+field_namedefgenerate_dda_map_title(grid,field,level,datetime_format=None):""" creates the dda map plot title Parameters ---------- grid : grid The grid object field : str name of the background field level : int Verical level plotted. datetime_format : str or None The date time format to use Returns ------- titl : str The plot title """begin_time=pyart.graph.common.generate_radar_time_begin(grid)ifdatetime_format:time_str=begin_time.strftime(datetime_format)else:time_str=begin_time.isoformat()+"Z"radar_names=""formdataingrid.metadata["additional_radars"]:ifisinstance(mdata["radar_name"],bytes):mdata["radar_name"]=mdata["radar_name"].decode("utf-8")radar_names+="-"+mdata["radar_name"]height=grid.z["data"][level]/1000.0l1=f"DDA: {radar_names}{height:.1f} km {time_str}"field_name="Hor. wind vectors (u,v) with "+fieldreturnl1+"\n"+field_namedefgenerate_dda_latitude_slice_title(grid,field,level,datetime_format=None,wind_vectors="hor"):""" creates the dda latitude slice plot title Parameters ---------- grid : grid The grid object field : str name of the background field level : int latitudinal level plotted. datetime_format : str or None The date time format to use wind_vectors : str 'hor' if horizontal wind vectors are displayed (u and v) or 'ver' if vertical wind vectors are displayed (v and w) Returns ------- titl : str The plot title """begin_time=pyart.graph.common.generate_radar_time_begin(grid)ifdatetime_format:time_str=begin_time.strftime(datetime_format)else:time_str=begin_time.isoformat()+"Z"radar_names=""formdataingrid.metadata["additional_radars"]:ifisinstance(mdata["radar_name"],bytes):mdata["radar_name"]=mdata["radar_name"].decode("utf-8")radar_names+="-"+mdata["radar_name"]disp=grid.x["data"][level]/1000.0ifdisp>=0:direction="east"else:direction="west"disp=-displ1=f"DDA: {radar_names}{disp:.1f} km {direction} of origin {time_str}"ifwind_vectors=="hor":field_name="Hor. wind vectors (u,v)"elifwind_vectors=="ver":field_name="Vert. wind vectors (v,w)"field_name+=" with "+fieldreturnl1+"\n"+field_namedefgenerate_dda_longitude_slice_title(grid,field,level,datetime_format=None,wind_vectors="hor"):""" creates the dda longitude slice plot title Parameters ---------- grid : grid The grid object field : str name of the background field level : int longitudinal level plotted. datetime_format : str or None The date time format to use wind_vectors : str 'hor' if horizontal wind vectors are displayed (u and v) or 'ver' if vertical wind vectors are displayed (v and w) Returns ------- titl : str The plot title """begin_time=pyart.graph.common.generate_radar_time_begin(grid)ifdatetime_format:time_str=begin_time.strftime(datetime_format)else:time_str=begin_time.isoformat()+"Z"radar_names=""formdataingrid.metadata["additional_radars"]:ifisinstance(mdata["radar_name"],bytes):mdata["radar_name"]=mdata["radar_name"].decode("utf-8")radar_names+="-"+mdata["radar_name"]disp=grid.x["data"][level]/1000.0ifdisp>=0:direction="north"else:direction="south"disp=-displ1=f"DDA: {radar_names}{disp:.1f} km {direction} of origin {time_str}"ifwind_vectors=="hor":field_name="Hor. wind vectors (u,v)"elifwind_vectors=="ver":field_name="Vert. wind vectors (v,w)"field_name+=" with "+fieldreturnl1+"\n"+field_name
[docs]defget_colobar_label(field_dict,field_name):""" creates the colorbar label using field metadata Parameters ---------- field_dict : dict dictionary containing field metadata field_name : str name of the field Returns ------- label : str colorbar label """if"standard_name"infield_dict:standard_name=field_dict["standard_name"]elif"long_name"infield_dict:standard_name=field_dict["long_name"]else:standard_name=field_nameif"units"infield_dict:units=field_dict["units"]else:units="?"returnpyart.graph.common.generate_colorbar_label(standard_name,units)
[docs]defget_field_name(field_dict,field):""" Return a nice field name for a particular field Parameters ---------- field_dict : dict dictionary containing field metadata field : str name of the field Returns ------- field_name : str the field name """if"standard_name"infield_dict:field_name=field_dict["standard_name"]elif"long_name"infield_dict:field_name=field_dict["long_name"]else:field_name=str(field)field_name=field_name.replace("_"," ")field_name=field_name[0].upper()+field_name[1:]returnfield_name
defget_norm(field_name,field_dict={},isxarray=False):""" Computes the normalization of the colormap, and gets the ticks and labels of the colorbar from the metadata of the field. Returns None if the required parameters are not present in the metadata. If field dict is not None the metadata is obtained directly from the field. Otherwise it is obtained from the Py-ART config file Parameters ---------- field_name : str name of the field field_dict : dict or None dictionary containing the field and its metadata. isxarray : bool whether or not the norm will be used with xarray's plotting functions default is false, which means that matplotlib plotting functions will be used should be set to true when plotting Grid objects which are handled as xarray by pyart Returns ------- norm : list the colormap index ticks : list the list of ticks in the colorbar labels : list the list of labels corresponding to each tick """norm=Noneticks=Noneticklabs=Noneref_dict=pyart.config.get_metadata(field_name)cmap=mpl.colormaps.get_cmap(pyart.config.get_field_colormap(field_name))iffield_dictisnotNoneand"boundaries"infield_dict:ifisxarray:ncolors=len(field_dict["boundaries"])-1else:ncolors=cmap.Nnorm=mpl.colors.BoundaryNorm(boundaries=field_dict["boundaries"],ncolors=ncolors)elif"boundaries"inref_dict:ifisxarray:ncolors=len(ref_dict["boundaries"])-1else:ncolors=cmap.Nnorm=mpl.colors.BoundaryNorm(boundaries=ref_dict["boundaries"],ncolors=ncolors)iffield_dictisnotNoneand"ticks"infield_dict:ticks=field_dict["ticks"]if"labels"infield_dict:ticklabs=field_dict["labels"]elif"ticks"inref_dict:ticks=ref_dict["ticks"]if"labels"inref_dict:ticklabs=ref_dict["labels"]returnnorm,ticks,ticklabs