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

Overlay of HLines with categorical axis doesn't work. #6208

Open
BMM3 opened this issue Apr 24, 2024 · 0 comments
Open

Overlay of HLines with categorical axis doesn't work. #6208

BMM3 opened this issue Apr 24, 2024 · 0 comments

Comments

@BMM3
Copy link

BMM3 commented Apr 24, 2024

ALL software version info

holoviews: 1.18.3
pandas: 2.2.1
bokeh: 3.4.0

Description of expected behavior and the observed behavior

When creating an overlay of a HLines graph with a categorical axes (e.g. boxwhisker), I get an error.
Creating an overlay with a continuous axis (e.g. Scatter) does work normally.
Creating an overly of HLine with a categorical axis also works normally.

Complete, minimal, self-contained example code that reproduces the issue

import pandas as pd
import holoviews as hv
df = pd.DataFrame({'x':  [1,1,1,1,2,2,2,2], 
                   'y': [2,3,4,5,4,5,3,7],
                   })

# HLines gives an issue
p1 = hv.BoxWhisker(df, 'x', 'y')
p1_ref = hv.HLines([5])
p1_total = p1*p1_ref

# HLine does work
p2 = hv.BoxWhisker(df, 'x', 'y')
p2_ref = hv.HLine(5)
p2_total = p2*p2_ref

Stack traceback and/or browser JavaScript console output


ValueError Traceback (most recent call last)
File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\IPython\core\formatters.py:977, in MimeBundleFormatter.call(self, obj, include, exclude)
974 method = get_real_method(obj, self.print_method)
976 if method is not None:
--> 977 return method(include=include, exclude=exclude)
978 return None
979 else:

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\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 c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\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 c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\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 c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\ipython\display_hooks.py:255, in display(obj, raw_output, **kwargs)
253 elif isinstance(obj, (CompositeOverlay, ViewableElement)):
254 with option_state(obj):
--> 255 output = element_display(obj)
256 elif isinstance(obj, (Layout, NdLayout, AdjointLayout)):
257 with option_state(obj):

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\ipython\display_hooks.py:149, in display_hook..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 c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\ipython\display_hooks.py:195, in element_display(element, max_frames)
192 if type(element) not in Store.registry[backend]:
193 return None
--> 195 return render(element)

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\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 c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\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 c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\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 c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\panel\viewable.py:736, in Viewable._render_model(self, doc, comm)
734 if comm is None:
735 comm = state._comm_manager.get_server_comm()
--> 736 model = self.get_root(doc, comm)
738 if self._design and self._design.theme.bokeh_theme:
739 doc.theme = self._design.theme.bokeh_theme

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\panel\layout\base.py:320, in Panel.get_root(self, doc, comm, preprocess)
316 def get_root(
317 self, doc: Optional[Document] = None, comm: Optional[Comm] = None,
318 preprocess: bool = True
319 ) -> Model:
--> 320 root = super().get_root(doc, comm, preprocess)
321 # ALERT: Find a better way to handle this
322 if hasattr(root, 'styles') and 'overflow-x' in root.styles:

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\panel\viewable.py:667, in Renderable.get_root(self, doc, comm, preprocess)
665 wrapper = self._design._wrapper(self)
666 if wrapper is self:
--> 667 root = self._get_model(doc, comm=comm)
668 if preprocess:
669 self._preprocess(root)

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\panel\layout\base.py:186, in Panel._get_model(self, doc, root, parent, comm)
184 root = root or model
185 self._models[root.ref['id']] = (model, parent)
--> 186 objects, _ = self._get_objects(model, [], doc, root, comm)
187 props = self._get_properties(doc)
188 props[self._property_mapping['objects']] = objects

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\panel\layout\base.py:168, in Panel._get_objects(self, model, old_objects, doc, root, comm)
166 else:
167 try:
--> 168 child = pane._get_model(doc, root, model, comm)
169 except RerenderError as e:
170 if e.layout is not None and e.layout is not self:

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\panel\pane\holoviews.py:429, in HoloViews._get_model(self, doc, root, parent, comm)
427 plot = self.object
428 else:
--> 429 plot = self._render(doc, comm, root)
431 plot.pane = self
432 backend = plot.renderer.backend

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\panel\pane\holoviews.py:525, in HoloViews._render(self, doc, comm, root)
522 if comm:
523 kwargs['comm'] = comm
--> 525 return renderer.get_plot(self.object, **kwargs)

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\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 c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\plotting\renderer.py:240, in Renderer.get_plot(self_or_cls, obj, doc, renderer, comm, **kwargs)
237 defaults = [kd.default for kd in plot.dimensions]
238 init_key = tuple(v if d is None else d for v, d in
239 zip(plot.keys[0], defaults))
--> 240 plot.update(init_key)
241 else:
242 plot = obj

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\plotting\plot.py:955, in DimensionedPlot.update(self, key)
953 def update(self, key):
954 if len(self) == 1 and key in (0, self.keys[0]) and not self.drawn:
--> 955 return self.initialize_plot()
956 item = self.getitem(key)
957 self.traverse(lambda x: setattr(x, '_updated', True))

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\plotting\bokeh\element.py:2892, in OverlayPlot.initialize_plot(self, ranges, plot, plots)
2890 if plot and not self.overlaid:
2891 self._update_plot(key, plot, element)
-> 2892 self._update_ranges(element, ranges)
2894 panels = []
2895 for key, subplot in self.subplots.items():

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\plotting\bokeh\element.py:1048, in ElementPlot._update_ranges(self, element, ranges)
1045 y_range = self.handles['y_range']
1046 plot = self.handles['plot']
-> 1048 self._update_main_ranges(element, x_range, y_range, ranges)
1050 if self._subcoord_overlaid:
1051 return

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\plotting\bokeh\element.py:1091, in ElementPlot._update_main_ranges(self, element, x_range, y_range, ranges)
1089 xfactors, yfactors = None, None
1090 if any(isinstance(ax_range, FactorRange) for ax_range in [x_range, y_range]):
-> 1091 xfactors, yfactors = self._get_factors(element, ranges)
1092 framewise = self.framewise
1093 streaming = (self.streaming and any(stream._triggering and stream.following
1094 for stream in self.streaming))

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\plotting\bokeh\element.py:2845, in OverlayPlot._get_factors(self, overlay, ranges)
2843 if el is not None:
2844 elranges = util.match_spec(el, ranges)
-> 2845 xfs, yfs = sp._get_factors(el, elranges)
2846 if len(xfs):
2847 xfactors.append(xfs)

File c:\Users\bmm\Documents\projects\git\mlxscripts.venv\Lib\site-packages\holoviews\plotting\bokeh\element.py:1461, in ElementPlot._get_factors(self, element, ranges)
1457 def _get_factors(self, element, ranges):
1458 """
1459 Get factors for categorical axes.
1460 """
-> 1461 xdim, ydim = element.dimensions()[:2]
1462 xvals = self._get_dimension_factors(element, ranges, xdim)
1463 yvals = self._get_dimension_factors(element, ranges, ydim)

ValueError: not enough values to unpack (expected 2, got 1)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant