import intake
import hvplot.pandas
import hvplot.xarray
import cook_inlet_catalogs as cic
import holoviews as hv
Moorings (KBNERR): Kachemak Bay: Bear Cove, Seldovia¶
Moorings from Kachemak Bay National Estuarine Research Reserve (KBNERR)
Station mappings from AOOS/ERDDAP to KBNERR station list:
nerrs_kacsdwq :: kacsdwq
nerrs_kacsswq :: kacsswq
cdmo_nerrs_bearcove :: This is a different station than kacbcwq, which was active 2002-2003 while this is in 2015. They are also in different locations.
More information: https://accs.uaa.alaska.edu/kbnerr/
cat = intake.open_catalog(cic.utils.cat_path("moorings_kbnerr_bear_cove_seldovia"))
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
['cdmo_nerrs_bearcove', 'nerrs_kacsdwq', 'nerrs_kacsswq']
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
nerrs_kacsswq
| time | latitude | longitude | z | sea_water_temperature | sea_water_practical_salinity | |
|---|---|---|---|---|---|---|
| 0 | 2004-01-01 09:00:00+00:00 | 59.44099 | -151.72096 | 0.0 | 2.3 | 25.9 |
| 1 | 2004-01-01 09:15:00+00:00 | 59.44099 | -151.72096 | 0.0 | 2.4 | 26.5 |
| 2 | 2004-01-01 09:30:00+00:00 | 59.44099 | -151.72096 | 0.0 | 2.5 | 26.6 |
| 3 | 2004-01-01 09:45:00+00:00 | 59.44099 | -151.72096 | 0.0 | 3.0 | 27.0 |
| 4 | 2004-01-01 10:00:00+00:00 | 59.44099 | -151.72096 | 0.0 | 2.9 | 25.8 |
| ... | ... | ... | ... | ... | ... | ... |
| 733872 | 2025-06-11 18:45:00+00:00 | 59.44099 | -151.72096 | 0.0 | 8.3 | 30.6 |
| 733873 | 2025-06-11 19:00:00+00:00 | 59.44099 | -151.72096 | 0.0 | 8.3 | 30.7 |
| 733874 | 2025-06-11 19:15:00+00:00 | 59.44099 | -151.72096 | 0.0 | 8.6 | 29.8 |
| 733875 | 2025-06-11 19:30:00+00:00 | 59.44099 | -151.72096 | 0.0 | 8.4 | 30.4 |
| 733876 | 2025-06-11 19:45:00+00:00 | 59.44099 | -151.72096 | 0.0 | 8.4 | 30.7 |
733876 rows × 6 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']
---------------------------------------------------------------------------
DataError 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/stable/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/stable/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/stable/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/stable/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/stable/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/stable/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/stable/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/stable/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/stable/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/stable/lib/python3.11/site-packages/hvplot/converter.py:2590, in HoloViewsConverter.chart(self, element, x, y, data)
2588 ydim = hv.Dimension(c, label=self.value_label)
2589 kdims, vdims = self._get_dimensions([x], [ydim])
-> 2590 chart = element(data, kdims, vdims)
2591 chart = relabel_redim(chart, self._relabel, self._redim)
2592 charts.append((c, chart))
File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/holoviews/element/selection.py:24, in SelectionIndexExpr.__init__(self, *args, **kwargs)
23 def __init__(self, *args, **kwargs):
---> 24 super().__init__(*args, **kwargs)
25 self._index_skip = False
File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/holoviews/element/chart.py:54, in Chart.__init__(self, data, kdims, vdims, **params)
52 if len(params.get('kdims', [])) == self._max_kdim_count + 1:
53 self.param.warning('Chart elements should only be supplied a single kdim')
---> 54 super().__init__(data, **params)
File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/holoviews/core/data/__init__.py:338, in Dataset.__init__(self, data, kdims, vdims, **kwargs)
336 (data, self.interface, dims, extra_kws) = initialized
337 super().__init__(data, **dict(kwargs, **dict(dims, **extra_kws)))
--> 338 self.interface.validate(self, validate_vdims)
340 # Handle _pipeline property
341 if input_pipeline is None:
File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/holoviews/core/data/pandas.py:201, in PandasInterface.validate(cls, dataset, vdims)
199 not_found = [d for d in dimensions if d not in cols]
200 if not_found:
--> 201 raise DataError("Supplied data does not contain specified "
202 "dimensions, the following dimensions were "
203 f"not found: {not_found!r}", cls)
DataError: Supplied data does not contain specified dimensions, the following dimensions were not found: ['sea_surface_height_above_sea_level_geoid_local_station_datum']
PandasInterface expects tabular data, for more information on supported datatypes see https://holoviews.org/user_guide/Tabular_Datasets.html