From 11535bad3c819207b5809800e93d2dc8a80ce64a Mon Sep 17 00:00:00 2001 From: maximlt Date: Wed, 13 Dec 2023 16:05:59 +0100 Subject: [PATCH 1/2] fix setting hover_cols for ohlc --- hvplot/converter.py | 8 ++++---- hvplot/tests/plotting/testohlc.py | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 hvplot/tests/plotting/testohlc.py diff --git a/hvplot/converter.py b/hvplot/converter.py index 8c5664661..f81ccad48 100644 --- a/hvplot/converter.py +++ b/hvplot/converter.py @@ -2060,7 +2060,7 @@ def ohlc(self, x=None, y=None, data=None): o, h, l, c = y neg, pos = self.kwds.get('neg_color', 'red'), self.kwds.get('pos_color', 'green') color_exp = (dim(o)>dim(c)).categorize({True: neg, False: pos}) - ds = Dataset(data, [x], [o, h, l, c]) + ds = Dataset(data, [x], [o, h, l, c] + self.hover_cols) if ds.data[x].dtype.kind in 'SUO': rects = Rectangles(ds, [x, o, x, c]) else: @@ -2078,9 +2078,9 @@ def ohlc(self, x=None, y=None, data=None): tools = seg_cur_opts.pop('tools', []) if 'hover' in tools: tools[tools.index('hover')] = HoverTool(tooltips=[ - (x, '@{%s}' % x), ('Open', '@{%s}' % o), ('High', '@{%s}' % h), - ('Low', '@{%s}' % l), ('Close', '@{%s}' % c) - ]) + (x, f'@{x}'), ('Open', f'@{o}'), ('High', f'@{h}'), + ('Low', f'@{l}'), ('Close', f'@{c}') + ] + [(hc, f'@{hc}') for hc in self.hover_cols]) seg_cur_opts['tools'] = tools seg_cur_opts ['color'] = self.kwds.get('line_color', 'black') if 'xlabel' not in seg_cur_opts: diff --git a/hvplot/tests/plotting/testohlc.py b/hvplot/tests/plotting/testohlc.py new file mode 100644 index 000000000..816c24dd0 --- /dev/null +++ b/hvplot/tests/plotting/testohlc.py @@ -0,0 +1,21 @@ +import pandas as pd +import hvplot.pandas # noqa + + +df = pd.DataFrame({ + 'Open': [100.00, 101.25, 102.75], + 'High': [104.10, 105.50, 110.00], + 'Low': [94.00, 97.10, 99.20], + 'Close': [101.15, 99.70, 109.50], + 'Volume': [10012, 5000, 18000], + }, index=[pd.Timestamp('2022-08-01'), pd.Timestamp('2022-08-03'), pd.Timestamp('2022-08-04')]) + +ohlc_cols = ['Open', 'High', 'Low', 'Close'] + + +def test_ohlc_hover_cols(): + plot = df.hvplot.ohlc(y=ohlc_cols, hover_cols=['Volume']) + segments = plot.Segments.I + assert 'Volume' in segments + tooltips = segments.opts.get('plot').kwargs['tools'][0].tooltips + assert ('Volume', '@Volume') in tooltips From 6087e8fd8725e5a3b56807886c54011b08873838 Mon Sep 17 00:00:00 2001 From: maximlt Date: Thu, 14 Dec 2023 17:28:49 +0100 Subject: [PATCH 2/2] handle hover_cols set as 'all' --- hvplot/converter.py | 8 ++++++-- hvplot/tests/plotting/testohlc.py | 12 +++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/hvplot/converter.py b/hvplot/converter.py index f81ccad48..2bdcb822e 100644 --- a/hvplot/converter.py +++ b/hvplot/converter.py @@ -2060,7 +2060,11 @@ def ohlc(self, x=None, y=None, data=None): o, h, l, c = y neg, pos = self.kwds.get('neg_color', 'red'), self.kwds.get('pos_color', 'green') color_exp = (dim(o)>dim(c)).categorize({True: neg, False: pos}) - ds = Dataset(data, [x], [o, h, l, c] + self.hover_cols) + ohlc_cols = [o, h, l, c] + if x in self.hover_cols: + self.hover_cols.remove(x) + vdims = list(dict.fromkeys(ohlc_cols + self.hover_cols)) + ds = Dataset(data, [x], vdims) if ds.data[x].dtype.kind in 'SUO': rects = Rectangles(ds, [x, o, x, c]) else: @@ -2080,7 +2084,7 @@ def ohlc(self, x=None, y=None, data=None): tools[tools.index('hover')] = HoverTool(tooltips=[ (x, f'@{x}'), ('Open', f'@{o}'), ('High', f'@{h}'), ('Low', f'@{l}'), ('Close', f'@{c}') - ] + [(hc, f'@{hc}') for hc in self.hover_cols]) + ] + [(hc, f'@{hc}') for hc in vdims[4:]]) seg_cur_opts['tools'] = tools seg_cur_opts ['color'] = self.kwds.get('line_color', 'black') if 'xlabel' not in seg_cur_opts: diff --git a/hvplot/tests/plotting/testohlc.py b/hvplot/tests/plotting/testohlc.py index 816c24dd0..931ac8ff5 100644 --- a/hvplot/tests/plotting/testohlc.py +++ b/hvplot/tests/plotting/testohlc.py @@ -18,4 +18,14 @@ def test_ohlc_hover_cols(): segments = plot.Segments.I assert 'Volume' in segments tooltips = segments.opts.get('plot').kwargs['tools'][0].tooltips - assert ('Volume', '@Volume') in tooltips + assert len(tooltips) == len(df.columns) + 1 + assert tooltips[-1] == ('Volume', '@Volume') + + +def test_ohlc_hover_cols_all(): + plot = df.hvplot.ohlc(y=ohlc_cols, hover_cols='all') + segments = plot.Segments.I + assert 'Volume' in segments + tooltips = segments.opts.get('plot').kwargs['tools'][0].tooltips + assert len(tooltips) == len(df.columns) + 1 + assert tooltips[-1] == ('Volume', '@Volume')