"Coordinate is not backed by a Dask array" Errror when lazy loading xarray dataarray
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 3.6k
- Forks
- 377
- Avg merge
- 4h 32m
- Merged PRs (30d)
- 1
Description
Screenshots or screencasts of the bug in action
ALL software version info
09:24 $ conda list | grep -E "bokeh|datashader|holoviews|geoviews|hvplot|panel|dask|fsspec|intake|s3fs"
bokeh 3.3.4 pypi_0 pypi
bokeh-root-cmd 0.1.2 pypi_0 pypi
dask 2023.8.1 pypi_0 pypi
dask-core 2023.8.1 pyhd8ed1ab_0 conda-forge
dask-gateway 2023.9.0 pypi_0 pypi
dask-geopandas 0.3.1 pypi_0 pypi
dask-image 2023.3.0 pypi_0 pypi
datashader 0.16.0 pypi_0 pypi
fsspec 2023.12.2+32.g0c909ee pypi_0 pypi
geoviews 1.11.0 pypi_0 pypi
geoviews-core 1.11.0 pyha770c72_0 conda-forge
holoviews 1.18.1 pypi_0 pypi
hvplot 0.9.2 pypi_0 pypi
intake 0.7.0 pypi_0 pypi
intake-esm 2023.6.14 pypi_0 pypi
intake-geopandas 0.4.0 pypi_0 pypi
intake-parquet 0.3.0 pypi_0 pypi
intake-stac 0.4.0 pypi_0 pypi
intake-xarray 0.7.0 pypi_0 pypi
jupyter-bokeh 3.0.7 pypi_0 pypi
jupyter-panel-proxy 0.1.0 pypi_0 pypi
jupyter_bokeh 3.0.7 pyhd8ed1ab_0 conda-forge
panel 1.3.8 pypi_0 pypi
s3fs 2023.12.2 pypi_0 pypi
Description of expected behavior and the observed behavior
When I try to use hvplot with rasterize=True on this xarray dataarray it fails with:
WARNING:param.dynamic_operation: Callable raised "ValueError('DataArray Hwave is backed by a Dask array, \nbut coordinate lon_rho is not backed by a Dask array with identical \ndimension order and chunks')".
...
ValueError: DataArray Hwave is backed by a Dask array,
but coordinate lon_rho is not backed by a Dask array with identical
dimension order and chunks
Complete, minimal, self-contained example code that reproduces the issue
This is completely reproducible (loads data via S3 with no AWS credentials required):
import xarray as xr
import hvplot.xarray
import intake
import fsspec
intake_catalog_url = 'https://usgs-coawst.s3.amazonaws.com/useast-archive/coawst_intake.yml'
ds = intake.open_catalog(intake_catalog_url)['COAWST-USEAST'].to_dask()
da = ds['Hwave']
print(da)
# THIS DOESN'T work: use lazy loading with datashader
da2d = da.sel(ocean_time='2012-10-29 12:00', method='nearest')
da2d.hvplot.quadmesh(x='lon_rho', y='lat_rho', rasterize=True)
it's worth noting that we don't get errors if we either: (1) load the data into memory first, (2) turn off datashader or (3) mod the coordinates to appease datashader. In other words, these all work:
da2d = da.sel(ocean_time='2012-10-29 12:00', method='nearest').load()
da2d.hvplot.quadmesh(x='lon_rho', y='lat_rho', rasterize=True)
da2d = da.sel(ocean_time='2012-10-29 12:00', method='nearest')
da2d.hvplot.quadmesh(x='lon_rho', y='lat_rho')
da2d = da.sel(ocean_time='2012-10-29 12:00', method='nearest')
da2d['lon_rho'] = da2d['lon_rho'].chunk()
da2d['lat_rho'] = da2d['lat_rho'].chunk()
da2d.unify_chunks().hvplot.quadmesh(x='lon_rho', y='lat_rho', rasterize=True)
Stack traceback and/or browser JavaScript console output
WARNING:param.dynamic_operation: Callable raised "ValueError('DataArray Hwave is backed by a Dask array, \nbut coordinate lon_rho is not backed by a Dask array with identical \ndimension order and chunks')".
Invoked as dynamic_operation(height=300, scale=1.0, width=700, x_range=None, y_range=None)
WARNING:param.dynamic_operation: Callable raised "ValueError('DataArray Hwave is backed by a Dask array, \nbut coordinate lon_rho is not backed by a Dask array with identical \ndimension order and chunks')".
Invoked as dynamic_operation(height=300, scale=1.0, width=700, x_range=None, y_range=None)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/IPython/core/formatters.py:974, in MimeBundleFormatter.__call__(self, obj, include, exclude)
971 method = get_real_method(obj, self.print_method)
973 if method is not None:
--> 974 return method(include=include, exclude=exclude)
975 return None
976 else:
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/dimension.py:1286, in Dimensioned._repr_mimebundle_(self, include, exclude)
1279 def _repr_mimebundle_(self, include=None, exclude=None):
1280 """
1281 Resolves the class hierarchy for the class rendering the
1282 object using any display hooks registered on Store.display
1283 hooks. The output of all registered display_hooks is then
1284 combined and returned.
1285 """
-> 1286 return Store.render(self)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/options.py:1428, in Store.render(cls, obj)
1426 data, metadata = {}, {}
1427 for hook in hooks:
-> 1428 ret = hook(obj)
1429 if ret is None:
1430 continue
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/ipython/display_hooks.py:287, in pprint_display(obj)
285 if not ip.display_formatter.formatters['text/plain'].pprint:
286 return None
--> 287 return display(obj, raw_output=True)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/ipython/display_hooks.py:261, in display(obj, raw_output, **kwargs)
259 elif isinstance(obj, (HoloMap, DynamicMap)):
260 with option_state(obj):
--> 261 output = map_display(obj)
262 elif isinstance(obj, Plot):
263 output = render(obj)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/ipython/display_hooks.py:149, in display_hook.<locals>.wrapped(element)
147 try:
148 max_frames = OutputSettings.options['max_frames']
--> 149 mimebundle = fn(element, max_frames=max_frames)
150 if mimebundle is None:
151 return {}, {}
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/ipython/display_hooks.py:209, in map_display(vmap, max_frames)
206 max_frame_warning(max_frames)
207 return None
--> 209 return render(vmap)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/ipython/display_hooks.py:76, in render(obj, **kwargs)
73 if renderer.fig == 'pdf':
74 renderer = renderer.instance(fig='png')
---> 76 return renderer.components(obj, **kwargs)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/plotting/renderer.py:396, in Renderer.components(self, obj, fmt, comm, **kwargs)
393 embed = (not (dynamic or streams or self.widget_mode == 'live') or config.embed)
395 if embed or config.comms == 'default':
--> 396 return self._render_panel(plot, embed, comm)
397 return self._render_ipywidget(plot)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/plotting/renderer.py:403, in Renderer._render_panel(self, plot, embed, comm)
401 doc = Document()
402 with config.set(embed=embed):
--> 403 model = plot.layout._render_model(doc, comm)
404 if embed:
405 return render_model(model, comm)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/panel/viewable.py:748, in Viewable._render_model(self, doc, comm)
746 if comm is None:
747 comm = state._comm_manager.get_server_comm()
--> 748 model = self.get_root(doc, comm)
750 if self._design and self._design.theme.bokeh_theme:
751 doc.theme = self._design.theme.bokeh_theme
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/panel/layout/base.py:311, in Panel.get_root(self, doc, comm, preprocess)
307 def get_root(
308 self, doc: Optional[Document] = None, comm: Optional[Comm] = None,
309 preprocess: bool = True
310 ) -> Model:
--> 311 root = super().get_root(doc, comm, preprocess)
312 # ALERT: Find a better way to handle this
313 if hasattr(root, 'styles') and 'overflow-x' in root.styles:
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/panel/viewable.py:666, in Renderable.get_root(self, doc, comm, preprocess)
664 wrapper = self._design._wrapper(self)
665 if wrapper is self:
--> 666 root = self._get_model(doc, comm=comm)
667 if preprocess:
668 self._preprocess(root)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/panel/layout/base.py:177, in Panel._get_model(self, doc, root, parent, comm)
175 root = root or model
176 self._models[root.ref['id']] = (model, parent)
--> 177 objects, _ = self._get_objects(model, [], doc, root, comm)
178 props = self._get_properties(doc)
179 props[self._property_mapping['objects']] = objects
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/panel/layout/base.py:159, in Panel._get_objects(self, model, old_objects, doc, root, comm)
157 else:
158 try:
--> 159 child = pane._get_model(doc, root, model, comm)
160 except RerenderError as e:
161 if e.layout is not None and e.layout is not self:
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/panel/pane/holoviews.py:423, in HoloViews._get_model(self, doc, root, parent, comm)
421 plot = self.object
422 else:
--> 423 plot = self._render(doc, comm, root)
425 plot.pane = self
426 backend = plot.renderer.backend
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/panel/pane/holoviews.py:518, in HoloViews._render(self, doc, comm, root)
515 if comm:
516 kwargs['comm'] = comm
--> 518 return renderer.get_plot(self.object, **kwargs)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/plotting/bokeh/renderer.py:68, in BokehRenderer.get_plot(self_or_cls, obj, doc, renderer, **kwargs)
61 @bothmethod
62 def get_plot(self_or_cls, obj, doc=None, renderer=None, **kwargs):
63 """
64 Given a HoloViews Viewable return a corresponding plot instance.
65 Allows supplying a document attach the plot to, useful when
66 combining the bokeh model with another plot.
67 """
---> 68 plot = super().get_plot(obj, doc, renderer, **kwargs)
69 if plot.document is None:
70 plot.document = Document() if self_or_cls.notebook_context else curdoc()
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/plotting/renderer.py:217, in Renderer.get_plot(self_or_cls, obj, doc, renderer, comm, **kwargs)
214 raise SkipRendering(msg.format(dims=dims))
216 # Initialize DynamicMaps with first data item
--> 217 initialize_dynamic(obj)
219 if not renderer:
220 renderer = self_or_cls
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/plotting/util.py:270, in initialize_dynamic(obj)
268 continue
269 if not len(dmap):
--> 270 dmap[dmap._initial_key()]
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/spaces.py:1216, in DynamicMap.__getitem__(self, key)
1214 # Not a cross product and nothing cached so compute element.
1215 if cache is not None: return cache
-> 1216 val = self._execute_callback(*tuple_key)
1217 if data_slice:
1218 val = self._dataslice(val, data_slice)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/spaces.py:983, in DynamicMap._execute_callback(self, *args)
980 kwargs['_memoization_hash_'] = hash_items
982 with dynamicmap_memoization(self.callback, self.streams):
--> 983 retval = self.callback(*args, **kwargs)
984 return self._style(retval)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/spaces.py:581, in Callable.__call__(self, *args, **kwargs)
578 args, kwargs = (), dict(pos_kwargs, **kwargs)
580 try:
--> 581 ret = self.callable(*args, **kwargs)
582 except KeyError:
583 # KeyError is caught separately because it is used to signal
584 # invalid keys on DynamicMap and should not warn
585 raise
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/util/__init__.py:1033, in Dynamic._dynamic_operation.<locals>.dynamic_operation(*key, **kwargs)
1032 def dynamic_operation(*key, **kwargs):
-> 1033 key, obj = resolve(key, kwargs)
1034 return apply(obj, *key, **kwargs)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/util/__init__.py:1022, in Dynamic._dynamic_operation.<locals>.resolve(key, kwargs)
1020 elif isinstance(map_obj, DynamicMap) and map_obj._posarg_keys and not key:
1021 key = tuple(kwargs[k] for k in map_obj._posarg_keys)
-> 1022 return key, map_obj[key]
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/spaces.py:1216, in DynamicMap.__getitem__(self, key)
1214 # Not a cross product and nothing cached so compute element.
1215 if cache is not None: return cache
-> 1216 val = self._execute_callback(*tuple_key)
1217 if data_slice:
1218 val = self._dataslice(val, data_slice)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/spaces.py:983, in DynamicMap._execute_callback(self, *args)
980 kwargs['_memoization_hash_'] = hash_items
982 with dynamicmap_memoization(self.callback, self.streams):
--> 983 retval = self.callback(*args, **kwargs)
984 return self._style(retval)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/spaces.py:581, in Callable.__call__(self, *args, **kwargs)
578 args, kwargs = (), dict(pos_kwargs, **kwargs)
580 try:
--> 581 ret = self.callable(*args, **kwargs)
582 except KeyError:
583 # KeyError is caught separately because it is used to signal
584 # invalid keys on DynamicMap and should not warn
585 raise
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/util/__init__.py:1034, in Dynamic._dynamic_operation.<locals>.dynamic_operation(*key, **kwargs)
1032 def dynamic_operation(*key, **kwargs):
1033 key, obj = resolve(key, kwargs)
-> 1034 return apply(obj, *key, **kwargs)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/util/__init__.py:1026, in Dynamic._dynamic_operation.<locals>.apply(element, *key, **kwargs)
1024 def apply(element, *key, **kwargs):
1025 kwargs = dict(util.resolve_dependent_kwargs(self.p.kwargs), **kwargs)
-> 1026 processed = self._process(element, key, kwargs)
1027 if (self.p.link_dataset and isinstance(element, Dataset) and
1028 isinstance(processed, Dataset) and processed._dataset is None):
1029 processed._dataset = element.dataset
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/util/__init__.py:1008, in Dynamic._process(self, element, key, kwargs)
1006 elif isinstance(self.p.operation, Operation):
1007 kwargs = {k: v for k, v in kwargs.items() if k in self.p.operation.param}
-> 1008 return self.p.operation.process_element(element, key, **kwargs)
1009 else:
1010 return self.p.operation(element, **kwargs)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/operation.py:194, in Operation.process_element(self, element, key, **params)
191 else:
192 self.p = param.ParamOverrides(self, params,
193 allow_extra_keywords=self._allow_extra_keywords)
--> 194 return self._apply(element, key)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/operation.py:141, in Operation._apply(self, element, key)
139 if not in_method:
140 element._in_method = True
--> 141 ret = self._process(element, key)
142 if hasattr(element, '_in_method') and not in_method:
143 element._in_method = in_method
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/operation/datashader.py:1504, in rasterize._process(self, element, key)
1501 op = transform.instance(**{k:v for k,v in extended_kws.items()
1502 if k in transform.param})
1503 op._precomputed = self._precomputed
-> 1504 element = element.map(op, predicate)
1505 self._precomputed = op._precomputed
1507 unused_params = list(all_supplied_kws - all_allowed_kws)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/data/__init__.py:196, in PipelineMeta.pipelined.<locals>.pipelined_fn(*args, **kwargs)
193 inst._in_method = True
195 try:
--> 196 result = method_fn(*args, **kwargs)
197 if PipelineMeta.disable:
198 return result
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/data/__init__.py:1213, in Dataset.map(self, *args, **kwargs)
1211 @wraps(LabelledData.map)
1212 def map(self, *args, **kwargs):
-> 1213 return super().map(*args, **kwargs)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/dimension.py:697, in LabelledData.map(self, map_fn, specs, clone)
695 return deep_mapped
696 else:
--> 697 return map_fn(self) if applies else self
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/operation.py:214, in Operation.__call__(self, element, **kwargs)
210 return element.clone([(k, self._apply(el, key=k))
211 for k, el in element.items()])
212 elif ((self._per_element and isinstance(element, Element)) or
213 (not self._per_element and isinstance(element, ViewableElement))):
--> 214 return self._apply(element)
215 elif 'streams' not in kwargs:
216 kwargs['streams'] = self.p.streams
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/core/operation.py:141, in Operation._apply(self, element, key)
139 if not in_method:
140 element._in_method = True
--> 141 ret = self._process(element, key)
142 if hasattr(element, '_in_method') and not in_method:
143 element._in_method = in_method
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/holoviews/operation/datashader.py:1121, in quadmesh_rasterize._process(self, element, key)
1117 cvs = ds.Canvas(plot_width=width, plot_height=height,
1118 x_range=x_range, y_range=y_range)
1120 vdim = getattr(agg_fn, 'column', element.vdims[0].name)
-> 1121 agg = cvs.quadmesh(data[vdim], x.name, y.name, agg_fn)
1122 xdim, ydim = list(agg.dims)[:2][::-1]
1123 if xtype == "datetime":
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/datashader/core.py:879, in Canvas.quadmesh(self, source, x, y, agg)
877 elif xarr.ndim == 2:
878 glyph = QuadMeshCurvilinear(x, y, name)
--> 879 return bypixel(source, self, glyph, agg)
880 else:
881 raise ValueError("""\
882 x- and y-coordinate arrays must have 1 or 2 dimensions.
883 Received arrays with dimensions: {dims}""".format(
884 dims=list(xarr.dims)))
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/datashader/core.py:1335, in bypixel(source, canvas, glyph, agg, antialias)
1333 with warnings.catch_warnings():
1334 warnings.filterwarnings('ignore', r'All-NaN (slice|axis) encountered')
-> 1335 return bypixel.pipeline(source, schema, canvas, glyph, agg, antialias=antialias)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/datashader/utils.py:114, in Dispatcher.__call__(self, head, *rest, **kwargs)
112 typ = type(head)
113 if typ in lk:
--> 114 return lk[typ](head, *rest, **kwargs)
115 for cls in getmro(typ)[1:]:
116 if cls in lk:
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/datashader/data_libraries/xarray.py:32, in xarray_pipeline(xr_ds, schema, canvas, glyph, summary, antialias)
30 else:
31 from datashader.data_libraries.dask_xarray import dask_xarray_pipeline
---> 32 return dask_xarray_pipeline(
33 glyph, xr_ds, schema, canvas, summary, antialias=antialias, cuda=cuda)
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/datashader/data_libraries/dask_xarray.py:17, in dask_xarray_pipeline(glyph, xr_ds, schema, canvas, summary, antialias, cuda)
16 def dask_xarray_pipeline(glyph, xr_ds, schema, canvas, summary, *, antialias=False, cuda=False):
---> 17 dsk, name = dask_glyph_dispatch(
18 glyph, xr_ds, schema, canvas, summary, antialias=antialias, cuda=cuda)
20 # Get user configured scheduler (if any), or fall back to default
21 # scheduler for dask DataFrame
22 scheduler = dask.base.get_scheduler() or xr_ds.__dask_scheduler__
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/datashader/utils.py:114, in Dispatcher.__call__(self, head, *rest, **kwargs)
112 typ = type(head)
113 if typ in lk:
--> 114 return lk[typ](head, *rest, **kwargs)
115 for cls in getmro(typ)[1:]:
116 if cls in lk:
File /home/conda/global/c38ce6b3dd031e242f379cd2db6eeed4b319d52166140421c3853ba62d37ab15-20240202-114729-108416-82-pangeo2/lib/python3.11/site-packages/datashader/data_libraries/dask_xarray.py:271, in dask_curvilinear(glyph, xr_ds, schema, canvas, summary, antialias, cuda)
263 err_msg = (
264 "DataArray {name} is backed by a Dask array, \n"
265 "but coordinate {coord} is not backed by a Dask array with identical \n"
266 "dimension order and chunks"
267 )
268 if (not isinstance(x_centers, dask.array.Array) or
269 xr_ds[glyph.name].dims != xr_ds[glyph.x].dims or
270 xr_ds[glyph.name].chunks != xr_ds[glyph.x].chunks):
--> 271 raise ValueError(err_msg.format(name=glyph.name, coord=glyph.x))
273 if (not isinstance(y_centers, dask.array.Array) or
274 xr_ds[glyph.name].dims != xr_ds[glyph.y].dims or
275 xr_ds[glyph.name].chunks != xr_ds[glyph.y].chunks):
276 raise ValueError(err_msg.format(name=glyph.name, coord=glyph.y))
ValueError: DataArray Hwave is backed by a Dask array,
but coordinate lon_rho is not backed by a Dask array with identical
dimension order and chunks
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the self-contained example through the hvplot.xarray quadmesh entry point with rasterize=True, comparing the lazy-loaded, loaded, and manually rechunked cases. Done means the lazy-loaded DataArray renders with rasterization without requiring data to be loaded or coordinates to be manually rechunked, while the existing working cases remain functional.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data-visualization
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100