uPlot icon indicating copy to clipboard operation
uPlot copied to clipboard

missing points in plot when surrounded by null values

Open nicolaszuts opened this issue 9 months ago • 1 comments

Hi,

I wanted to share an edge case that we've encountered when dealing with null data points. If a non-null data point is surrounded by null values, and if we haven't overriden the default options, then we risk encountering a situation where a point does not show up in the plot unless hovered. I've attached screenshots and a demo for your reference:

Image Image

Demo: https://codepen.io/tempac0345/pen/wvVOEPq

As you can see, the data does have a point in index 2 but it does not show up in the first image. We've managed to fix this on our side with the following series point options:

const seriesPointsFilter = (
  u,
  sIdx,
  show,
)=> {
  const vals = u.data[sIdx];

  // respect when default uplot behaviour sets show to true
  if (seriesPointsShow(u, sIdx)) {
    return Array.from(vals.keys());
  }

  const indices: number[] = [];

  for (let i = 0; i < vals.length; i++) {
    if (vals[i] === null) {
      continue;
    }

    const prevNull =
      i === 0 || vals[i - 1] === null
    const nextNull =
      i === vals.length - 1 ||
      vals[i + 1] === null

    if (prevNull && nextNull) indices.push(i);
  }

  return indices;
};

 points: {
            show: true,
            filter: seriesPointsFilter,
          },

As you can see, we use the series point filter option to maintain the default "show" behaviour where relevant whilst also forcing the non-null points surrounded by null values to show up in the chart. It's not ideal for every use case but it works well for us.

My opinion is that hiding those points feels like unexpected behavior. We use uplot for dynamic data and so this issue went unnoticed for a few days. In our case, those data points are of equal importance to the rest of the data. It feels to me like it should be part of the default behaviour so I thought it best to share this with you just in case you agreed. If you disagree, feel free to close the issue.

Thanks as always!

nicolaszuts avatar Mar 17 '25 23:03 nicolaszuts

i have a few demos of doing this using series.points.filter. see the orange series in the first chart:

https://leeoniya.github.io/uPlot/demos/points.html

My opinion is that hiding those points feels like unexpected behavior.

i agree that it's not a great default behavior and kind of overlaps with density-adaptive point visibility. i'll leave this open to consider integrating it into the core as the default in the future.

leeoniya avatar Mar 17 '25 23:03 leeoniya