holoviz / hvplot

A high-level plotting API for pandas, dask, xarray, and networkx built on HoloViews
https://hvplot.holoviz.org
BSD 3-Clause "New" or "Revised" License
1.12k stars 108 forks source link

Tooltips "@value" no longer works #1441

Open yt87 opened 2 days ago

yt87 commented 2 days ago

ALL software version info

Software Version Info ```plaintext Include version information here python 3.13.0 h9ebbce0_100_cp313 conda-forge hvplot 0.10.0 pyhd8ed1ab_0 conda-forge holoviews 1.18.3 pyhd8ed1ab_0 conda-forge bokeh 3.6.0 pyhd8ed1ab_0 conda-forge ```

Description of expected behavior and the observed behavior

hvplot 1.19 broke bokeh tooltips. The ("value", "@value") entry in tooltips does not make hover tool to display dataframe column values.

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

This is a slightly modified example from https://discourse.holoviz.org/t/how-to-set-up-hovertool-for-multiple-columns-with-hvplot/4294/4. I run it as

panel serve --dev Untitled.ipynb

It works fine with holoviews up to 1.18.3, fails with higher versions, see the screen capture below..


# code goes here between backticks
import hvplot.pandas
import numpy as np
import pandas as pd
import panel as pn

pn.extension()

index = pd.date_range("2020-07-01", "2021-07-01", freq="D")
data = np.random.random((index.size, 4)) + 10 * np.arange(4)[np.newaxis, :]
df = pd.DataFrame(data, index=index, columns=list("ABCD"))

from bokeh.models import DatetimeTickFormatter, HoverTool

tickfmt = DatetimeTickFormatter(years="%m-%d", months="%m-%d")

tooltips = [
    ("Month-Day", "@index{%m-%d}"),
    ("value", "@value"),
    ("name", "@Variable")
]
hover = HoverTool(tooltips=tooltips, formatters={"@index": "datetime"})

plot = df.hvplot(xformatter=tickfmt, tools=[hover])
pn.Row(plot).servable()

#### Stack traceback and/or browser JavaScript console output

#### Screenshots or screencasts of the bug in action
![2024-10-15-064047_726x360_scrot](https://github.com/user-attachments/assets/0311ee0f-4568-4871-9aba-e32161b83ca1)

- [ ] I may be interested in making a pull request to address this
yt87 commented 2 days ago

Trying again...

scrot

yt87 commented 2 days ago

The new features hover_tooltips and hover_formatters do work, so this is not a big issue, just a backward incompatible change. I guess this issue can be closed.

ahuang11 commented 1 day ago

Can you share how you used the hover_tooltips/hover_formatters?

ahuang11 commented 1 day ago

The behavior was changed here: https://github.com/holoviz/hvplot/pull/1350

ahuang11 commented 1 day ago

Found it: https://github.com/holoviz/hvplot/pull/1350/files#diff-994c24099e9daf2dc458d1c4a0cad7381cccb075c5f438509b92fbb3bc3e8021L2132

Previously:

chart = element(data, kdims, vdims).redim(**{c: self.value_label})

Now:

chart = element(data, kdims, vdims)

And self._redim is {}. Not sure if this intentional; will defer to @maximlt

yt87 commented 1 day ago

This is the code that works:

import hvplot.pandas
import numpy as np
import pandas as pd
import panel as pn

pn.extension()

index = pd.date_range("2020-07-01", "2021-07-01", freq="D")
data = np.random.random((index.size, 4)) + 10 * np.arange(4)[np.newaxis, :]
df = pd.DataFrame(data, index=index, columns=list("ABCD"))

from bokeh.models import DatetimeTickFormatter

tickfmt = DatetimeTickFormatter(years="%m-%d", months="%m-%d")

tooltips = [
    ("Month-Day", "@index{%m-%d}"),
    ("value", "@value"),
    ("name", "@Variable")
]
formatters={"@index": "datetime"}

plot = df.hvplot(xformatter=tickfmt, hover_tooltips=tooltips, hover_formatters=formatters)
pn.Row(plot).servable()
maximlt commented 1 day ago

The behavior was changed here: #1350

Just to confirm, did you do a git bisect?

Found it: https://github.com/holoviz/hvplot/pull/1350/files#diff-994c24099e9daf2dc458d1c4a0cad7381cccb075c5f438509b92fbb3bc3e8021L2132

Previously:

chart = element(data, kdims, vdims).redim(**{c: self.value_label})

Now:

chart = element(data, kdims, vdims)

And self._redim is {}. Not sure if this intentional; will defer to @maximlt

I can't look at this today but just want to note that the whole code now is:

chart = element(data, kdims, vdims)
chart = relabel_redim(chart, self._relabel, self._redim)
charts.append((c, chart))
ahuang11 commented 22 hours ago

Manually bisected :)

I initially thought my hover_tooltips PR broke it, but was surprised to find it was not the culprit, so I checked out relevant sounding ones, re-ran the code, and found it.