Plan Position Indicator#
A Plan Position Indicator (PPI) plot is a common plot requested by radar scientists. Letβs show how to create this plot using xradar
Imports#
import cmweather # noqa
from open_radar_data import DATASETS
import xradar as xd
import cartopy
import matplotlib.pyplot as plt
Read in some data#
Fetching CfRadial1 radar data file from open-radar-data repository.
filename = DATASETS.fetch("cfrad.20080604_002217_000_SPOL_v36_SUR.nc")
Read the data using the cfradial1 engine
radar = xd.io.open_cfradial1_datatree(filename, first_dim="auto")
display(radar)
<xarray.DataTree>
Group: /
β Dimensions: (sweep: 9)
β Coordinates:
β latitude float64 8B ...
β longitude float64 8B ...
β altitude float64 8B ...
β Dimensions without coordinates: sweep
β Data variables:
β volume_number int32 4B ...
β platform_type |S32 32B ...
β primary_axis |S32 32B ...
β status_str |S1 1B ...
β instrument_type |S32 32B ...
β time_coverage_start |S32 32B ...
β time_coverage_end |S32 32B ...
β sweep_group_name (sweep) <U7 252B 'sweep_0' 'sweep_1' ... 'sweep_8'
β sweep_fixed_angle (sweep) float32 36B ...
β Attributes: (12/13)
β Conventions: CF/Radial instrument_parameters radar_parameters rad...
β version: 1.2
β title: TIMREX
β institution:
β references:
β source:
β ... ...
β comment:
β instrument_name: SPOLRVP8
β site_name:
β scan_name:
β scan_id: 0
β platform_is_mobile: false
βββ Group: /sweep_0
β Dimensions: (azimuth: 483, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB ...
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:15:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 483B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_1
β Dimensions: (azimuth: 483, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB ...
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:16:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 483B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_2
β Dimensions: (azimuth: 482, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB ...
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:17:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 482B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_3
β Dimensions: (azimuth: 483, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB ...
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:17:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 483B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_4
β Dimensions: (azimuth: 481, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB ...
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:18:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 481B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_5
β Dimensions: (azimuth: 482, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB ...
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:19:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 482B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_6
β Dimensions: (azimuth: 482, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB ...
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:20:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 482B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_7
β Dimensions: (azimuth: 484, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB ...
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:21:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 484B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_8
Dimensions: (azimuth: 483, range: 996)
Coordinates:
* azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
elevation (azimuth) float32 2kB ...
time (azimuth) datetime64[ns] 4kB 2008-06-04T00:21:...
* range (range) float32 4kB 150.0 300.0 ... 1.494e+05
Data variables: (12/18)
sweep_number int32 4B ...
sweep_mode <U20 80B 'azimuth_surveillance'
prt_mode |S32 32B ...
follow_mode |S32 32B ...
sweep_fixed_angle float32 4B ...
pulse_width (azimuth) float32 2kB ...
... ...
r_calib_index (azimuth) int8 483B ...
measured_transmit_power_h (azimuth) float32 2kB ...
measured_transmit_power_v (azimuth) float32 2kB ...
scan_rate (azimuth) float32 2kB ...
DBZ (azimuth, range) float32 2MB ...
VR (azimuth, range) float32 2MB ...Add georeferencing#
We can use the georeference function, or the accessor to add our georeference information!
Georeference Accessor#
If you prefer the accessor (.xradar.georefence()), this is how you would add georeference information to your radar object.
radar = radar.xradar.georeference()
display(radar)
<xarray.DataTree>
Group: /
β Dimensions: (sweep: 9)
β Coordinates:
β latitude float64 8B ...
β longitude float64 8B ...
β altitude float64 8B ...
β Dimensions without coordinates: sweep
β Data variables:
β volume_number int32 4B ...
β platform_type |S32 32B ...
β primary_axis |S32 32B ...
β status_str |S1 1B ...
β instrument_type |S32 32B ...
β time_coverage_start |S32 32B ...
β time_coverage_end |S32 32B ...
β sweep_group_name (sweep) <U7 252B 'sweep_0' 'sweep_1' ... 'sweep_8'
β sweep_fixed_angle (sweep) float32 36B ...
β Attributes: (12/13)
β Conventions: CF/Radial instrument_parameters radar_parameters rad...
β version: 1.2
β title: TIMREX
β institution:
β references:
β source:
β ... ...
β comment:
β instrument_name: SPOLRVP8
β site_name:
β scan_name:
β scan_id: 0
β platform_is_mobile: false
βββ Group: /sweep_0
β Dimensions: (azimuth: 483, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB 0.5164 0.5219 ... 0.5219
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:15:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β x (azimuth, range) float64 4MB 0.0 ... -1.955e+03
β y (azimuth, range) float64 4MB 150.0 ... 1.493e+05
β z (azimuth, range) float64 4MB 46.35 ... 2.718e+03
β latitude float64 8B 22.53
β longitude float64 8B 120.4
β altitude float64 8B 45.0
β crs_wkt int64 8B 0
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 483B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_1
β Dimensions: (azimuth: 483, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB 1.104 1.104 ... 1.104 1.104
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:16:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β x (azimuth, range) float64 4MB 0.0 ... -1.954e+03
β y (azimuth, range) float64 4MB 150.0 ... 1.493e+05
β z (azimuth, range) float64 4MB 47.89 ... 4.236e+03
β latitude float64 8B 22.53
β longitude float64 8B 120.4
β altitude float64 8B 45.0
β crs_wkt int64 8B 0
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 483B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_2
β Dimensions: (azimuth: 482, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB 1.796 1.796 ... 1.796 1.796
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:17:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β x (azimuth, range) float64 4MB 0.0 ... -1.953e+03
β y (azimuth, range) float64 4MB 149.9 ... 1.492e+05
β z (azimuth, range) float64 4MB 49.7 ... 6.039e+03
β latitude float64 8B 22.53
β longitude float64 8B 120.4
β altitude float64 8B 45.0
β crs_wkt int64 8B 0
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 482B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_3
β Dimensions: (azimuth: 483, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB 2.598 2.598 ... 2.598 2.598
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:17:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β x (azimuth, range) float64 4MB 0.0 ... -1.952e+03
β y (azimuth, range) float64 4MB 149.8 ... 1.491e+05
β z (azimuth, range) float64 4MB 51.8 ... 8.127e+03
β latitude float64 8B 22.53
β longitude float64 8B 120.4
β altitude float64 8B 45.0
β crs_wkt int64 8B 0
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 483B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_4
β Dimensions: (azimuth: 481, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB 3.598 3.598 ... 3.598 3.598
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:18:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β x (azimuth, range) float64 4MB 0.0 ... -1.949e+03
β y (azimuth, range) float64 4MB 149.7 ... 1.489e+05
β z (azimuth, range) float64 4MB 54.41 ... 1.073e+04
β latitude float64 8B 22.53
β longitude float64 8B 120.4
β altitude float64 8B 45.0
β crs_wkt int64 8B 0
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 481B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_5
β Dimensions: (azimuth: 482, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB 4.708 4.708 ... 4.708 4.708
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:19:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β x (azimuth, range) float64 4MB 0.0 ... -1.946e+03
β y (azimuth, range) float64 4MB 149.5 ... 1.487e+05
β z (azimuth, range) float64 4MB 57.31 ... 1.361e+04
β latitude float64 8B 22.53
β longitude float64 8B 120.4
β altitude float64 8B 45.0
β crs_wkt int64 8B 0
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 482B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_6
β Dimensions: (azimuth: 482, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB 6.471 6.471 ... 6.471 6.471
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:20:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β x (azimuth, range) float64 4MB 0.0 ... -1.939e+03
β y (azimuth, range) float64 4MB 149.0 ... 1.481e+05
β z (azimuth, range) float64 4MB 61.91 ... 1.818e+04
β latitude float64 8B 22.53
β longitude float64 8B 120.4
β altitude float64 8B 45.0
β crs_wkt int64 8B 0
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 482B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_7
β Dimensions: (azimuth: 484, range: 996)
β Coordinates:
β * azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
β elevation (azimuth) float32 2kB 9.102 9.102 ... 9.102 9.102
β time (azimuth) datetime64[ns] 4kB 2008-06-04T00:21:...
β * range (range) float32 4kB 150.0 300.0 ... 1.494e+05
β x (azimuth, range) float64 4MB 0.0 ... -1.925e+03
β y (azimuth, range) float64 4MB 148.1 ... 1.471e+05
β z (azimuth, range) float64 4MB 68.73 ... 2.496e+04
β latitude float64 8B 22.53
β longitude float64 8B 120.4
β altitude float64 8B 45.0
β crs_wkt int64 8B 0
β Data variables: (12/18)
β sweep_number int32 4B ...
β sweep_mode <U20 80B 'azimuth_surveillance'
β prt_mode |S32 32B ...
β follow_mode |S32 32B ...
β sweep_fixed_angle float32 4B ...
β pulse_width (azimuth) float32 2kB ...
β ... ...
β r_calib_index (azimuth) int8 484B ...
β measured_transmit_power_h (azimuth) float32 2kB ...
β measured_transmit_power_v (azimuth) float32 2kB ...
β scan_rate (azimuth) float32 2kB ...
β DBZ (azimuth, range) float32 2MB ...
β VR (azimuth, range) float32 2MB ...
βββ Group: /sweep_8
Dimensions: (azimuth: 483, range: 996)
Coordinates:
* azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
elevation (azimuth) float32 2kB 12.8 12.8 ... 12.79 12.8
time (azimuth) datetime64[ns] 4kB 2008-06-04T00:21:...
* range (range) float32 4kB 150.0 300.0 ... 1.494e+05
x (azimuth, range) float64 4MB 0.0 ... -1.899e+03
y (azimuth, range) float64 4MB 146.3 ... 1.451e+05
z (azimuth, range) float64 4MB 78.23 ... 3.439e+04
latitude float64 8B 22.53
longitude float64 8B 120.4
altitude float64 8B 45.0
crs_wkt int64 8B 0
Data variables: (12/18)
sweep_number int32 4B ...
sweep_mode <U20 80B 'azimuth_surveillance'
prt_mode |S32 32B ...
follow_mode |S32 32B ...
sweep_fixed_angle float32 4B ...
pulse_width (azimuth) float32 2kB ...
... ...
r_calib_index (azimuth) int8 483B ...
measured_transmit_power_h (azimuth) float32 2kB ...
measured_transmit_power_v (azimuth) float32 2kB ...
scan_rate (azimuth) float32 2kB ...
DBZ (azimuth, range) float32 2MB ...
VR (azimuth, range) float32 2MB ...Please observe, that the additional coordinates x, y, z have been added to the dataset. This will also add spatial_ref CRS information on the used Azimuthal Equidistant Projection.
radar["sweep_0"]
<xarray.DataTree 'sweep_0'>
Group: /sweep_0
Dimensions: (sweep: 9, azimuth: 483, range: 996)
Coordinates:
* azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
elevation (azimuth) float32 2kB 0.5164 0.5219 ... 0.5219
time (azimuth) datetime64[ns] 4kB 2008-06-04T00:15:...
* range (range) float32 4kB 150.0 300.0 ... 1.494e+05
x (azimuth, range) float64 4MB 0.0 ... -1.955e+03
y (azimuth, range) float64 4MB 150.0 ... 1.493e+05
z (azimuth, range) float64 4MB 46.35 ... 2.718e+03
latitude float64 8B 22.53
longitude float64 8B 120.4
altitude float64 8B 45.0
crs_wkt int64 8B 0
Dimensions without coordinates: sweep
Data variables: (12/18)
sweep_number int32 4B ...
sweep_mode <U20 80B 'azimuth_surveillance'
prt_mode |S32 32B ...
follow_mode |S32 32B ...
sweep_fixed_angle float32 4B ...
pulse_width (azimuth) float32 2kB ...
... ...
r_calib_index (azimuth) int8 483B ...
measured_transmit_power_h (azimuth) float32 2kB ...
measured_transmit_power_v (azimuth) float32 2kB ...
scan_rate (azimuth) float32 2kB ...
DBZ (azimuth, range) float32 2MB ...
VR (azimuth, range) float32 2MB ...Use the Function#
We can also use the function xd.geoference.get_x_y_z_tree function if you prefer that method.
radar = xd.georeference.get_x_y_z_tree(radar)
display(radar["sweep_0"])
<xarray.DataTree 'sweep_0'>
Group: /sweep_0
Dimensions: (sweep: 9, azimuth: 483, range: 996)
Coordinates:
* azimuth (azimuth) float32 2kB 0.0 0.75 ... 358.5 359.2
elevation (azimuth) float32 2kB 0.5164 0.5219 ... 0.5219
time (azimuth) datetime64[ns] 4kB 2008-06-04T00:15:...
* range (range) float32 4kB 150.0 300.0 ... 1.494e+05
x (azimuth, range) float64 4MB 0.0 ... -1.955e+03
y (azimuth, range) float64 4MB 150.0 ... 1.493e+05
z (azimuth, range) float64 4MB 46.35 ... 2.718e+03
latitude float64 8B 22.53
longitude float64 8B 120.4
altitude float64 8B 45.0
crs_wkt int64 8B 0
Dimensions without coordinates: sweep
Data variables: (12/18)
sweep_number int32 4B ...
sweep_mode <U20 80B 'azimuth_surveillance'
prt_mode |S32 32B ...
follow_mode |S32 32B ...
sweep_fixed_angle float32 4B ...
pulse_width (azimuth) float32 2kB ...
... ...
r_calib_index (azimuth) int8 483B ...
measured_transmit_power_h (azimuth) float32 2kB ...
measured_transmit_power_v (azimuth) float32 2kB ...
scan_rate (azimuth) float32 2kB ...
DBZ (azimuth, range) float32 2MB ...
VR (azimuth, range) float32 2MB ...Plot our Data#
Plot simple PPI#
Now, letβs create our PPI plot! We just use the newly created 2D-coordinates x and y to create a meshplot.
radar["sweep_0"]["DBZ"].plot(x="x", y="y", cmap="ChaseSpectral")
<matplotlib.collections.QuadMesh at 0x7ae350348050>
Plot PPI with geographic coordinates#
fig, ax = plt.subplots(figsize=(10, 8))
radar = xd.georeference.get_x_y_z_tree(radar, target_crs=4326)
sweep = radar["sweep_0"]
sweep["DBZ"].plot(x="x", y="y", cmap="ChaseSpectral")
ax.grid(True, which="both", linestyle="--", color="gray", alpha=0.5)
ax.set_xlabel("Longitude")
ax.set_ylabel("Latitude")
ax.set_title("Radar Reflectivity Sweep")
Text(0.5, 1.0, 'Radar Reflectivity Sweep')
Plot PPI on map with cartopy#
If you have cartopy installed, you can easily plot on maps. We first have to extract the CRS from the dataset and to wrap it in a cartopy.crs.Projection.
proj_crs = xd.georeference.get_crs(radar["sweep_0"].to_dataset(inherit="all_coords"))
cart_crs = cartopy.crs.Projection(proj_crs)
Second, we create a matplotlib GeoAxes and a nice map.
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection=cartopy.crs.PlateCarree())
radar["sweep_0"]["DBZ"].plot(
x="x",
y="y",
cmap="ChaseSpectral",
transform=cart_crs,
cbar_kwargs=dict(pad=0.075, shrink=0.75),
)
ax.coastlines()
ax.gridlines(draw_labels=True)
/home/docs/checkouts/readthedocs.org/user_builds/xradar/conda/stable/lib/python3.13/site-packages/cartopy/mpl/geoaxes.py:1762: UserWarning: The input coordinates to pcolormesh are interpreted as cell centers, but are not monotonically increasing or decreasing. This may lead to incorrectly calculated cell edges, in which case, please supply explicit cell edges to pcolormesh.
result = super().pcolormesh(*args, **kwargs)
<cartopy.mpl.gridliner.Gridliner at 0x7ae35034aba0>