import intake
import hvplot.pandas
import hvplot.xarray
import cook_inlet_catalogs as cic
import holoviews as hv

CTD Profiles (EcoFOCI): Shelikof Strait

CTD Casts taken as part of the EcoFOCI project.

EcoFOCI project page: https://www.ecofoci.noaa.gov/

Data page: https://data.pmel.noaa.gov/pmel/erddap/tabledap/Shelikof_line8_3695_0ada_d066.html

PMEL ERDDAP: https://data.pmel.noaa.gov/pmel/erddap/index.html

Map of related project work

cat = intake.open_catalog(cic.utils.cat_path("ctd_profiles_ecofoci"))

Plot all datasets in catalog

dd, ddlabels = cic.utils.combine_datasets_for_map(cat)
dd.hvplot(**cat.metadata["map"]) * ddlabels.hvplot(**cat.metadata["maplabels"])

List available datasets in the catalog

dataset_ids = list(cat)
dataset_ids
['di853a0062',
 'di853a0064',
 'di853a0065',
 'di853a0066',
 'di853a0068',
 'di853a0069',
 'di853a0070',
 'di857a0030',
 'di857a0031',
 'di857a0032',
 'di857a0033',
 'di857a0034',
 'di857a0035',
 'di857a0036',
 'dy0808c001',
 'dy0808c002',
 'dy0808c003',
 'dy0808c004',
 'dy0808c005',
 'dy0808c006',
 'dy0808c007',
 'dy0808c008',
 'dy0808c009',
 'dy0808c010',
 'dy0808c011',
 'dy0808c012',
 'dy0808c013',
 'dy1204c002',
 'dy1204c003',
 'dy1204c004',
 'dy1204c005',
 'dy1204c006',
 'dy1204c007',
 'dy1204c008',
 'fw848a0001',
 'fw848a0002',
 'fw848a0003',
 'fw848a0004',
 'fw848a0005',
 'fw848a0006',
 'fw848a0007',
 'fw848a0008',
 'fw848a0009',
 'fw848a0010',
 'fw848a0011',
 'fw848a0012',
 'gp0101c067',
 'gp0101c068',
 'gp0101c069',
 'gp0201c075',
 'gp0201c076',
 'gp0201c077',
 'la9802c046',
 'la9802c047',
 'la9802c048',
 'mf0008c001',
 'mf0008c002',
 'mf0008c003',
 'mf0105004',
 'mf0105005',
 'mf0105006',
 'mf0105007',
 'mf0105008',
 'mf0105009',
 'mf0201c005',
 'mf0201c006',
 'mf0201c007',
 'mf0201c008',
 'mf0201c009',
 'mf0201c010',
 'mf0201c011',
 'mf0207c001',
 'mf0207c002',
 'mf0207c003',
 'mf0207c004',
 'mf0207c005',
 'mf0207c006',
 'mf0303c002',
 'mf0309bc013',
 'mf0309bc014',
 'mf0309bc015',
 'mf0309bc016',
 'mf0309bc017',
 'mf0309bc018',
 'mf0309bc019',
 'mf0312c004',
 'mf0312c005',
 'mf0312c006',
 'mf0312c007',
 'mf0312c008',
 'mf0312c009',
 'mf0312c010',
 'mf0312c011',
 'mf0312c012',
 'mf0404c025',
 'mf0404c026',
 'mf0404c027',
 'mf0404c029',
 'mf0404c030',
 'mf0404c031',
 'mf0404c032',
 'mf0404c033',
 'mf0404c034',
 'mf0404c035',
 'mf0405bc001',
 'mf0407c001',
 'mf0407c002',
 'mf0407c003',
 'mf0407c004',
 'mf0407c005',
 'mf0407c006',
 'mf0504c003',
 'mf0504c004',
 'mf0504c005',
 'mf0504c006',
 'mf0504c007',
 'mf0504c008',
 'mf0504c009',
 'mf0504c010',
 'mf0504c011',
 'mf0504c012',
 'mf0508c002',
 'mf0508c003',
 'mf0508c004',
 'mf0508c005',
 'mf0508c006',
 'mf0508c007',
 'mf0602c003',
 'mf0602c004',
 'mf0602c005',
 'mf0602c006',
 'mf0602c008',
 'mf0602c009',
 'mf0602c010',
 'mf0602c011',
 'mf0602c012',
 'mf0702c003',
 'mf0702c004',
 'mf0702c005',
 'mf0702c006',
 'mf0702c007',
 'mf0702c008',
 'mf0702c009',
 'mf0708c003',
 'mf0708c004',
 'mf0708c005',
 'mf0708c006',
 'mf0708c007',
 'mf0708c008',
 'mf0802bc036',
 'mf0802bc037',
 'mf0802bc038',
 'mf0802bc039',
 'mf0802bc040',
 'mf0802bc041',
 'mf813b0021',
 'mf813b0022',
 'mf813b0023',
 'mf813b0024',
 'mf813b0025',
 'mf814a0021',
 'mf814a0022',
 'mf814a0023',
 'mf814a0024',
 'mf814a0049',
 'mf815a0021',
 'mf815a0022',
 'mf815a0023',
 'mf815a0024',
 'mf815a0025',
 'mf853a0006',
 'mf853a0008',
 'mf853a0009',
 'mf853a0010',
 'mf853a0011',
 'mf853a0012',
 'mf854a0008',
 'mf854a0009',
 'mf854a0010',
 'mf854a0011',
 'mf854a0012',
 'mf854a0013',
 'mf854a0014',
 'mf855a0001',
 'mf855a0002',
 'mf855a0003',
 'mf855a0004',
 'mf855a0005',
 'mf855a0006',
 'mf855a0007',
 'mf855a0008',
 'mf85aa0130',
 'mf85aa0131',
 'mf85aa0132',
 'mf85aa0133',
 'mf85aa0134',
 'mf85aa0135',
 'mf85aa0136',
 'mf862a0001',
 'mf862a0002',
 'mf862a0003',
 'mf862a0004',
 'mf862a0005',
 'mf862a0006',
 'mf862a0007',
 'mf863a0001',
 'mf863a0002',
 'mf863a0003',
 'mf863a0004',
 'mf863a0005',
 'mf863a0006',
 'mf863a0007',
 'mf863a0008',
 'mf863a0009',
 'mf863a0010',
 'mf863a0011',
 'mf863a0012',
 'mf863a0013',
 'mf863a0014',
 'mf865a0008',
 'mf865a0009',
 'mf865a0010',
 'mf865a0011',
 'mf865a0012',
 'mf865a0013',
 'mf865a0014',
 'mf865a0070',
 'mf865a0071',
 'mf865a0072',
 'mf865a0073',
 'mf865a0074',
 'mf865a0075',
 'mf865a0076',
 'mf865a0077',
 'mf873a0001',
 'mf873a0002',
 'mf873a0003',
 'mf873a0004',
 'mf873a0005',
 'mf873a0006',
 'mf873a0007',
 'mf874a0001',
 'mf874a0002',
 'mf874a0003',
 'mf874a0004',
 'mf874a0005',
 'mf874a0006',
 'mf874a0007',
 'mf874a0008',
 'mf874a0009',
 'mf874a0012',
 'mf878a0001',
 'mf878a0006',
 'mf878a0007',
 'mf878a0008',
 'mf878a0009',
 'mf878a0010',
 'mf878a0011',
 'mf878a0012',
 'mf883a0001',
 'mf883a0002',
 'mf883a0003',
 'mf883a0004',
 'mf883a0005',
 'mf883a0006',
 'mf883a0007',
 'mf893a0001',
 'mf893a0002',
 'mf893a0003',
 'mf893a0004',
 'mf893a0005',
 'mf893a0006',
 'mf893a0007',
 'mf894a0001',
 'mf894a0002',
 'mf894a0003',
 'mf894a0004',
 'mf894a0005',
 'mf894a0006',
 'mf894a0007',
 'mf894b0001',
 'mf894b0002',
 'mf894b0003',
 'mf894b0004',
 'mf894b0005',
 'mf894b0006',
 'mf894b0007',
 'mf894b0008',
 'mf904z0009',
 'mf904z0010',
 'mf904z0011',
 'mf904z0012',
 'mf904z0013',
 'mf904z0014',
 'mf904z0015',
 'mf905a0075',
 'mf905a0076',
 'mf905a0077',
 'mf905a0078',
 'mf905a0079',
 'mf905a0080',
 'mf905a0081',
 'mf905a0082',
 'mf905b0001',
 'mf905b0002',
 'mf905b0003',
 'mf905b0004',
 'mf905b0005',
 'mf905b0006',
 'mf905b0007',
 'mf905b0008',
 'mf905c0018',
 'mf905c0019',
 'mf905c0020',
 'mf905c0021',
 'mf905c0022',
 'mf905c0023',
 'mf905c0024',
 'mf914a0001',
 'mf914a0002',
 'mf914a0003',
 'mf914a0004',
 'mf914a0005',
 'mf914a0006',
 'mf914a0007',
 'mf914a0008',
 'mf914a0009',
 'mf914a0010',
 'mf914a0011',
 'mf914a0012',
 'mf914a0013',
 'mf914a0014',
 'mf914a0015',
 'mf914a0016',
 'mf914a0017',
 'mf914b0001',
 'mf914b0002',
 'mf914b0003',
 'mf914b0004',
 'mf914b0005',
 'mf914b0006',
 'mf914b0007',
 'mf914b0008',
 'mf914b0009',
 'mf914b0010',
 'mf914b0011',
 'mf914b0012',
 'mf914b0013',
 'mf914b0014',
 'mf91aa0001',
 'mf91aa0002',
 'mf91aa0003',
 'mf91aa0004',
 'mf91aa0005',
 'mf91aa0006',
 'mf91aa0007',
 'mf91aa0008',
 'mf91aa0009',
 'mf91aa0010',
 'mf92030001',
 'mf92030002',
 'mf92030003',
 'mf92030004',
 'mf92030005',
 'mf92030006',
 'mf92030007',
 'mf92030008',
 'mf92030009',
 'mf92030010',
 'mf92030011',
 'mf9205001',
 'mf9205002',
 'mf9205003',
 'mf9205004',
 'mf9205005',
 'mf9205006',
 'mf9205007',
 'mf9205008',
 'mf9205009',
 'mf9205010',
 'mf9206026',
 'mf9206027',
 'mf9206028',
 'mf9206029',
 'mf9206030',
 'mf9206031',
 'mf9206032',
 'mf9304001',
 'mf9304004',
 'mf9304005',
 'mf9304006',
 'mf9304007',
 'mf9304008',
 'mf9304009',
 'mf9306034',
 'mf9306035',
 'mf9306036',
 'mf9306037',
 'mf9306038',
 'mf9306039',
 'mf9308003',
 'mf9308004',
 'mf9308005',
 'mf9308006',
 'mf9401007',
 'mf9401008',
 'mf9401009',
 'mf9401010',
 'mf9403c016',
 'mf9403c021',
 'mf9403c022',
 'mf9403c023',
 'mf9403c024',
 'mf9403c025',
 'mf9403c026',
 'mf9403c027',
 'mf9403c028',
 'mf9404002',
 'mf9404003',
 'mf9404004',
 'mf9405003',
 'mf9405004',
 'mf9405005',
 'mf9405006',
 'mf9405007',
 'mf9405008',
 'mf9405009',
 'mf9405010',
 'mf9405011',
 'mf9405012',
 'mf9508c029',
 'mf9508c030',
 'mf9508c031',
 'mf9508c032',
 'mf9508c033',
 'mf9508c034',
 'mf9604c003',
 'mf9604c004',
 'mf9604c005',
 'mf9607c042',
 'mf9607c043',
 'mf9608c016',
 'mf9608c017',
 'mf9608c018',
 'mf9608c019',
 'mf9608c020',
 'mf9608c021',
 'mf9608c022',
 'mf9610c003',
 'mf9610c004',
 'mf9610c005',
 'mf9610c008',
 'mf9610c009',
 'mf9610c010',
 'mf9610c012',
 'mf9614c039',
 'mf9614c040',
 'mf9614c041',
 'mf9614c042',
 'mf9614c043',
 'mf9614c044',
 'mf9704c001',
 'mf9704c002',
 'mf9704c003',
 'mf9704c004',
 'mf9704c005',
 'mf9704c006',
 'mf9704c007',
 'mf9706c006',
 'mf9706c007',
 'mf9706c008',
 'mf9706c009',
 'mf9706c010',
 'mf9706c011',
 'mf9801c001',
 'mf9801c002',
 'mf9801c003',
 'mf9801c004',
 'mf9801c005',
 'mf9801c006',
 'mf9801c007',
 'mf9801c008',
 'mf9801c009',
 'mf9801c010',
 'mf9805ac001',
 'mf9805ac002',
 'mf9805ac003',
 'mf9805ac004',
 'mf9805ac006',
 'mf9805ac007',
 'mf9806c006',
 'mf9806c007',
 'mf9806c008',
 'mf9806c009',
 'mf9806c010',
 'mf9806c011',
 'mf9806c012',
 'rb0103a002',
 'rb0103a004',
 'w9905bc001',
 'w9905bc002',
 'w9905bc003',
 'w9905bc004',
 'w9905bc005',
 'w9905bc006',
 'w9905bc007',
 'we9806bc001',
 'we9806bc002',
 'we9806bc003',
 'we9806bc004',
 'we9806bc005',
 'we9806bc006',
 'we9806bc007',
 'we9806bc008',
 'we9806bc009']

Select one dataset to investigate

try:
    dataset_id = dataset_ids[2]
except:
    dataset_id = dataset_ids[0]
print(dataset_id)

dd = cat[dataset_id].read()
dd
di853a0065
id cast cruise time (UTC) longitude (degrees_east) latitude (degrees_north) depth (m) ocean_temperature_1 (Degree_C) ocean_practical_salinity_1 (PSU)
0 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 0.0 3.07 NaN
1 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 1.0 3.07 NaN
2 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 2.0 3.07 NaN
3 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 3.0 3.07 NaN
4 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 4.0 3.07 NaN
... ... ... ... ... ... ... ... ... ...
228 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 228.0 5.79 NaN
229 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 229.0 5.79 NaN
230 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 230.0 5.78 NaN
231 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 231.0 5.78 NaN
232 di853a0065 65 DI853A 1985-03-16T12:05:00Z -155.0433 57.628334 232.0 5.79 NaN

233 rows × 9 columns

Plot one dataset

keys = list(cat[dataset_id].metadata["plots"].keys())
print(keys)

plots = []
for key in keys:
    plot_kwargs = cat[dataset_id].metadata["plots"][key]
    if "clim" in plot_kwargs and isinstance(plot_kwargs["clim"], list):
        plot_kwargs["clim"] = tuple(plot_kwargs["clim"])
    if "dynamic" in plot_kwargs:
        plot_kwargs["dynamic"] = False
    plots.append(cat[dataset_id].ToHvPlot(**plot_kwargs).read())
hv.Layout(plots).cols(1)
['data']
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[6], line 11
      9     if "dynamic" in plot_kwargs:
     10         plot_kwargs["dynamic"] = False
---> 11     plots.append(cat[dataset_id].ToHvPlot(**plot_kwargs).read())
     12 hv.Layout(plots).cols(1)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/readers.py:121, in BaseReader.read(self, *args, **kwargs)
    119 kw.update(kwargs)
    120 args = kw.pop("args", ()) or args
--> 121 return self._read(*args, **kw)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/convert.py:629, in Pipeline._read(self, discover, **kwargs)
    627 kw = kwargs if i == len(self.steps) else {}
    628 if i:
--> 629     data = self._read_stage_n(i, data=data, **kw)
    630 else:
    631     data = self._read_stage_n(i, discover=discover, **kw)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/convert.py:615, in Pipeline._read_stage_n(self, stage, discover, **kwargs)
    613         return func(metadata=self.metadata).discover(*arg, **kw2)
    614     else:
--> 615         return func(metadata=self.metadata).read(*arg, **kw2)
    616 elif isinstance(func, BaseReader):
    617     if discover:

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/readers.py:121, in BaseReader.read(self, *args, **kwargs)
    119 kw.update(kwargs)
    120 args = kw.pop("args", ()) or args
--> 121 return self._read(*args, **kw)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/convert.py:62, in BaseConverter._read(self, data, *args, **kwargs)
     60 if isinstance(data, BaseReader):
     61     data = data.read()
---> 62 return self.run(data, *args, **kwargs)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/convert.py:192, in ToHvPlot.run(self, data, explorer, **kw)
    189 if explorer:
    190     # this is actually a hvplot.ui:hvPlotExplorer and only allows tabular data
    191     return hvplot.explorer(data, **kw)
--> 192 return hvplot.hvPlot(data, **kw)()

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/hvplot/plotting/core.py:95, in hvPlotBase.__call__(self, x, y, kind, **kwds)
     92         plot = self._get_converter(x, y, kind, **kwds)(kind, x, y)
     93         return pn.panel(plot, **panel_dict)
---> 95 return self._get_converter(x, y, kind, **kwds)(kind, x, y)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/hvplot/converter.py:2066, in HoloViewsConverter.__call__(self, kind, x, y)
   2063                 dataset = Dataset(data)
   2064             dataset = redim_(dataset, **self._redim)
-> 2066         obj = method(x, y)
   2067         obj._dataset = dataset
   2069 if self.crs and self.project:
   2070     # Apply projection before rasterizing

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/hvplot/converter.py:2601, in HoloViewsConverter.line(self, x, y, data)
   2599 def line(self, x=None, y=None, data=None):
   2600     self._error_if_unavailable('line')
-> 2601     return self.chart(Curve, x, y, data)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/hvplot/converter.py:2588, in HoloViewsConverter.chart(self, element, x, y, data)
   2586 charts = []
   2587 for c in y:
-> 2588     ydim = hv.Dimension(c, label=self.value_label)
   2589     kdims, vdims = self._get_dimensions([x], [ydim])
   2590     chart = element(data, kdims, vdims)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/holoviews/core/dimension.py:285, in Dimension.__init__(self, spec, **params)
    283     raise ValueError('Dimension name cannot be empty')
    284 if not all_params['label']:
--> 285     raise ValueError('Dimension label cannot be empty')
    287 values = params.get('values', [])
    288 if isinstance(values, str) and values == 'initial':

ValueError: Dimension label cannot be empty