diff --git a/hvplot/converter.py b/hvplot/converter.py index 8c5664661..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]) + 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: @@ -2078,9 +2082,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 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 new file mode 100644 index 000000000..931ac8ff5 --- /dev/null +++ b/hvplot/tests/plotting/testohlc.py @@ -0,0 +1,31 @@ +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 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')