leeoniya / uPlot

📈 A small, fast chart for time series, lines, areas, ohlc & bars
MIT License
8.83k stars 386 forks source link

setSeries hook: Allow distinguishing between toggling a series vs. just hovering #988

Open juliusv opened 3 months ago

juliusv commented 3 months ago

I want to mislead my users with stacked graphs, so I adopted the stacking code from https://leeoniya.github.io/uPlot/demos/stack.js (used by https://leeoniya.github.io/uPlot/demos/stacked-series.html).

It uses the setSeries hook to restack things when a series has been shown or hidden:

// restack on toggle
    opts.hooks = {
        setSeries: [
            (u, i) => {
                let stacked = stack(data, i => !u.series[i].show);
                u.delBand(null);
                stacked.bands.forEach(b => u.addBand(b));
                u.setData(stacked.data);
            }
        ],
    };

However, the setSeries hook also fires when just hovering and focusing a series, so by just hovering over a graph with many series, a lot of extra computations are taking place and things get slow.

Is there a nice way to distinguish between toggling a series vs. just hover-focusing, or would this require code changes to uPlot?

I guess I could do it right now by manually remembering & comparing the show states of all series between hook firings, but it would be nice to be able to just tell them apart.