Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ADD: New example showing how to use ACT to work with ARM and Satellit… #862

Merged
merged 4 commits into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 32 additions & 14 deletions act/plotting/xsectiondisplay.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,13 +146,14 @@ def set_yrng(self, yrng, subplot_index=(0,)):

def plot_xsection(
self,
dsname,
varname,
field,
dsname=None,
x=None,
y=None,
subplot_index=(0,),
sel_kwargs=None,
isel_kwargs=None,
set_title=None,
**kwargs,
):
"""
Expand All @@ -162,11 +163,10 @@ def plot_xsection(

Parameters
----------
dsname : str or None
The name of the datastream to plot from. Set to None to have
ACT attempt to automatically detect this.
varname : str
field : str
The name of the variable to plot.
dsname : str or None
The name of the datastream to plot from.
x : str or None
The name of the x coordinate variable.
y : str or None
Expand All @@ -181,6 +181,8 @@ def plot_xsection(
to slice datasets, see the documentation on :func:`xarray.DataArray.sel`.
isel_kwargs : dict
The keyword arguments to pass into :py:func:`xarray.DataArray.sel`
set_title : str
Title for the plot
**kwargs : keyword arguments
Additional keyword arguments will be passed into
:func:`xarray.DataArray.plot`.
Expand Down Expand Up @@ -220,9 +222,9 @@ def plot_xsection(
y_coord_dim = temp_ds[y].dims[0]
coord_list[y] = y_coord_dim
new_ds = data_utils.assign_coordinates(temp_ds, coord_list)
my_dataarray = new_ds[varname]
my_dataarray = new_ds[field]
else:
my_dataarray = temp_ds[varname]
my_dataarray = temp_ds[field]

coord_keys = [key for key in my_dataarray.coords.keys()]
# X-array will sometimes shorten latitude and longitude variables
Expand Down Expand Up @@ -255,28 +257,42 @@ def plot_xsection(
self.set_xrng(xrng, subplot_index)
yrng = self.axes[subplot_index].get_ylim()
self.set_yrng(yrng, subplot_index)

if set_title is None:
if 'long_name' in self._ds[dsname][field].attrs:
set_title = self._ds[dsname][field].attrs['long_name']
plt.title(set_title)

del temp_ds
return self.axes[subplot_index]

def plot_xsection_map(
self, dsname, varname, subplot_index=(0,), coastlines=True, background=False, **kwargs
self,
field,
dsname=None,
subplot_index=(0,),
coastlines=True,
background=False,
set_title=None,
**kwargs,
):
"""
Plots a cross section of 2D data on a geographical map.

Parameters
----------
dsname : str or None
The name of the datastream to plot from. Set to None
to have ACT attempt to automatically detect this.
varname : str
field : str
The name of the variable to plot.
dsname : str or None
The name of the datastream to plot from.
subplot_index : tuple
The index of the subplot to plot inside.
coastlines : bool
Set to True to plot the coastlines.
background : bool
Set to True to plot a stock image background.
set_title : str
Title for the plot
**kwargs : keyword arguments
Additional keyword arguments will be passed into
:func:`act.plotting.XSectionDisplay.plot_xsection`
Expand All @@ -292,7 +308,9 @@ def plot_xsection_map(
'Cartopy needs to be installed in order to plot ' + 'cross sections on maps!'
)
self.set_subplot_to_map(subplot_index)
self.plot_xsection(dsname, varname, subplot_index=subplot_index, **kwargs)
self.plot_xsection(
field, dsname=dsname, subplot_index=subplot_index, set_title=set_title, **kwargs
)
xlims = self.xrng[subplot_index].flatten()
ylims = self.yrng[subplot_index].flatten()
self.axes[subplot_index].set_xticks(np.linspace(round(xlims[0], 0), round(xlims[1], 0), 10))
Expand Down
53 changes: 53 additions & 0 deletions examples/plotting/plot_satellite.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
"""
Using ACT for Satellite data
----------------------------

Simple example for working with satellite data.
It is recommended that users explore other
satellite specific libraries suchas SatPy.

Author: Adam Theisen
"""

import act
import matplotlib.pyplot as plt
import numpy as np
from arm_test_data import DATASETS

# Read in VISST Data
files = DATASETS.fetch('enavisstgridm11minnisX1.c1.20230307.000000.cdf')
ds = act.io.read_arm_netcdf(files)

# Plot up the VISST cloud percentage using XSectionDisplay
display = act.plotting.XSectionDisplay(ds, figsize=(10, 8))
display.plot_xsection_map(
'cloud_percentage', x='longitude', y='latitude', isel_kwargs={'time': 0, 'cld_type': 0}
)
plt.show()

# Download ARM TSI Data
files = DATASETS.fetch('enatsiskycoverC1.b1.20230307.082100.cdf')
ds_tsi = act.io.read_arm_netcdf(files)
ds_tsi = ds_tsi.where(ds_tsi.percent_opaque > 0)
ds_tsi = ds_tsi.resample(time='30min').mean()

# Set coordinates to extra data for ENA
ena_lat = 39.091600
ena_lon = 28.025700

lat = ds['lat'].values
lon = ds['lon'].values

# Find the nearest pixel for the satellite data and extract it
lat_ind = np.argmin(np.abs(lat - ena_lat))
lon_ind = np.argmin(np.abs(lon - ena_lon))

ds_new = ds.isel(lat=lat_ind, lon=lon_ind, cld_type=0)

# Plot the comparison using TimeSeriesDisplay
display = act.plotting.TimeSeriesDisplay({'Satellite': ds_new, 'ARM': ds_tsi}, figsize=(15, 8))
display.plot('cloud_percentage', dsname='Satellite', label='VISST Cloud Percentage')
display.plot('percent_opaque', dsname='ARM', label='ARM TSI Percent Opaque')
display.day_night_background(dsname='ARM')
plt.legend()
plt.show()
8 changes: 4 additions & 4 deletions examples/plotting/plot_xsection.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
# Dimensions whose coordinates can be specified by variables in the file
display = act.plotting.XSectionDisplay(my_ds, figsize=(20, 8), subplot_shape=(2, 2))
display.plot_xsection_map(
None,
'ir_temperature',
None,
x='longitude',
y='latitude',
cmap='Greys',
Expand All @@ -30,8 +30,8 @@
subplot_index=(0, 0),
)
display.plot_xsection_map(
None,
'ir_temperature',
None,
x='longitude',
y='latitude',
cmap='Greys',
Expand All @@ -40,8 +40,8 @@
subplot_index=(1, 0),
)
display.plot_xsection_map(
None,
'ir_temperature',
None,
x='longitude',
y='latitude',
cmap='Greys',
Expand All @@ -50,8 +50,8 @@
subplot_index=(0, 1),
)
display.plot_xsection_map(
None,
'ir_temperature',
None,
x='longitude',
y='latitude',
cmap='Greys',
Expand Down
7 changes: 2 additions & 5 deletions tests/plotting/test_xsectiondisplay.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def test_xsection_errors():

display = XSectionDisplay(ds, figsize=(10, 8), subplot_shape=(1,))
with np.testing.assert_raises(RuntimeError):
display.plot_xsection(None, 'backscatter', x='time', cmap='HomeyerRainbow')
display.plot_xsection('backscatter', x='time', cmap='HomeyerRainbow')

ds.close()
matplotlib.pyplot.close(fig=display.fig)
Expand All @@ -39,9 +39,7 @@ def test_xsection_plot():
visst_ds = act.io.arm.read_arm_netcdf(sample_files.EXAMPLE_CEIL1)

xsection = XSectionDisplay(visst_ds, figsize=(10, 8))
xsection.plot_xsection(
None, 'backscatter', x='time', y='range', cmap='coolwarm', vmin=0, vmax=320
)
xsection.plot_xsection('backscatter', x='time', y='range', cmap='coolwarm', vmin=0, vmax=320)
visst_ds.close()

try:
Expand All @@ -63,7 +61,6 @@ def test_xsection_plot_map():
):
xsection = XSectionDisplay(radar_ds, figsize=(15, 8))
xsection.plot_xsection_map(
None,
'ir_temperature',
vmin=220,
vmax=300,
Expand Down
Loading