I am not sure I understand every step in the code as the reference has fragmented code snippets and I am not very familiar with holoviz packages. So, beforehand, sorry if there is something weird here. The code should work as it is in terms of imports and variable definition, but this is returning error. Any suggestion?
import numpy as np
import xarray as xr
import hvplot.xarray #noqa
import holoviews as hv
from holoviews.operation.datashader import datashade
#def sample_data(shape=(904, 999)):
def sample_data(shape=(90, 90)):
x = np.linspace(311.9, 391.1, shape[1])
y = np.linspace(-23.6, 24.8, shape[0])
x2d, y2d = np.meshgrid(x, y)
u = 10 * (2 * np.cos(2 * np.deg2rad(x2d) + 3 * np.deg2rad(y2d + 30)) ** 2)
v = 20 * np.cos(6 * np.deg2rad(x2d))
return x, y, u, v
xs, ys, U, V = sample_data()
mag = np.sqrt(U**2 + V**2)
angle = (np.pi/2.) - np.arctan2(U/mag, V/mag)
ds = xr.Dataset({'mag': xr.DataArray(mag, dims=('y', 'x'), coords={'y': ys, 'x': xs}),
'angle': xr.DataArray(angle, dims=('y', 'x'), coords={'y': ys, 'x': xs})})
quiver = ds.hvplot.vectorfield(x = "x", y = "y", mag = "mag", angle = "angle", hover = False).opts(magnitude = "mag")
streams = [hv.streams.RangeXY(source = quiver)]
def filter_points(points, x_range, y_range, nmax = 10):
if x_range is None or y_range is None:
return points
selected_points = points[x_range, y_range]
xs, ys = selected_points.shape
ix, iy = nmax // xs, nmax // ys
return selected_points[::ix, ::iy]
filtered = quiver.apply(filter_points, streams = streams)
datashade(filtered, width = 400, height = 400, streams = streams)
returns
WARNING:param.dynamic_operation: Callable raised "AttributeError("'VectorField' object has no attribute 'xdensity'")".
Invoked as dynamic_operation(x_range=None, y_range=None)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
File ~/miniforge3/envs/coringa/lib/python3.9/site-packages/IPython/core/formatters.py:972, in MimeBundleFormatter.__call__(self, obj, include, exclude)
969 method = get_real_method(obj, self.print_method)
971 if method is not None:
--> 972 return method(include=include, exclude=exclude)
973 return None
974 else:
File ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/site-packages/panel/viewable.py:737, in Viewable._render_model(self, doc, comm)
735 if comm is None:
736 comm = state._comm_manager.get_server_comm()
--> 737 model = self.get_root(doc, comm)
739 if self._design and self._design.theme.bokeh_theme:
740 doc.theme = self._design.theme.bokeh_theme
File ~/miniforge3/envs/coringa/lib/python3.9/site-packages/panel/layout/base.py:306, in Panel.get_root(self, doc, comm, preprocess)
302 def get_root(
303 self, doc: Optional[Document] = None, comm: Optional[Comm] = None,
304 preprocess: bool = True
305 ) -> Model:
--> 306 root = super().get_root(doc, comm, preprocess)
307 # ALERT: Find a better way to handle this
308 if hasattr(root, 'styles') and 'overflow-x' in root.styles:
File ~/miniforge3/envs/coringa/lib/python3.9/site-packages/panel/viewable.py:659, in Renderable.get_root(self, doc, comm, preprocess)
657 wrapper = self._design._wrapper(self)
658 if wrapper is self:
--> 659 root = self._get_model(doc, comm=comm)
660 if preprocess:
661 self._preprocess(root)
File ~/miniforge3/envs/coringa/lib/python3.9/site-packages/panel/layout/base.py:174, in Panel._get_model(self, doc, root, parent, comm)
172 root = root or model
173 self._models[root.ref['id']] = (model, parent)
--> 174 objects, _ = self._get_objects(model, [], doc, root, comm)
175 props = self._get_properties(doc)
176 props[self._property_mapping['objects']] = objects
File ~/miniforge3/envs/coringa/lib/python3.9/site-packages/panel/layout/base.py:156, in Panel._get_objects(self, model, old_objects, doc, root, comm)
154 else:
155 try:
--> 156 child = pane._get_model(doc, root, model, comm)
157 except RerenderError as e:
158 if e.layout is not None and e.layout is not self:
File ~/miniforge3/envs/coringa/lib/python3.9/site-packages/panel/pane/holoviews.py:411, in HoloViews._get_model(self, doc, root, parent, comm)
409 plot = self.object
410 else:
--> 411 plot = self._render(doc, comm, root)
413 plot.pane = self
414 backend = plot.renderer.backend
File ~/miniforge3/envs/coringa/lib/python3.9/site-packages/panel/pane/holoviews.py:506, in HoloViews._render(self, doc, comm, root)
503 if comm:
504 kwargs['comm'] = comm
--> 506 return renderer.get_plot(self.object, **kwargs)
File ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/site-packages/holoviews/plotting/util.py:270, in initialize_dynamic(obj)
268 continue
269 if not len(dmap):
--> 270 dmap[dmap._initial_key()]
File ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/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 ~/miniforge3/envs/coringa/lib/python3.9/site-packages/holoviews/operation/datashader.py:1526, in datashade._process(self, element, key)
1524 def _process(self, element, key=None):
1525 agg = rasterize._process(self, element, key)
-> 1526 shaded = shade._process(self, agg, key)
1527 return shaded
File ~/miniforge3/envs/coringa/lib/python3.9/site-packages/holoviews/operation/datashader.py:1268, in shade._process(self, element, key)
1266 return element.map(partial(shade._process, self), [Element])
1267 else:
-> 1268 xdensity = element.xdensity
1269 ydensity = element.ydensity
1270 bounds = element.bounds
AttributeError: 'VectorField' object has no attribute 'xdensity'