ChartJS - Moving vertical line is display on top of tooltip

Viewed 608

enter image description here

Hello,

I've followed this post (Moving vertical line when hovering over the chart using chart.js) to draw a vertical line on my chart.

With a single dataset, it's working just fine.

But for a multiple datasets display (with stacked options on the y-axis), the vertical line is drawn over the chart's tooltip.

Neither setting the z-index of the chart's tooltip nor the vertical line could solve my problem. Since I can't find any property to do that.

Do you have any idea/suggestion to solve this issue?

I'm using react-chart-js 2 with chart-js ^2.9.4 as a peer dependency.

1 Answers

You can use a custom plugin that draws after all the datasets have drawn but before the tooltip is drawn:

var options = {
  type: 'line',
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [{
        label: '# of Votes',
        data: [12, 19, 3, 5, 2, 3],
        borderWidth: 1
      },
      {
        label: '# of Points',
        data: [7, 11, 5, 8, 3, 7],
        borderWidth: 1
      }
    ]
  },
  options: {
    scales: {
      yAxes: [{
        stacked: true
      }]
    },
    plugins: {
      customLine: {
        width: 5,
        color: 'pink'
      }
    }
  },
  plugins: [{
    id: 'customLine',
    afterDatasetsDraw: (chart, x, opts) => {
      const width = opts.width || 1;
      const color = opts.color || 'black'

      if (!chart.active || chart.active.length === 0) {
        return;
      }

      const {
        chartArea: {
          top,
          bottom
        }
      } = chart;
      const xValue = chart.active[0]._model.x

      ctx.lineWidth = width;
      ctx.strokeStyle = color;

      ctx.beginPath();
      ctx.moveTo(xValue, top);
      ctx.lineTo(xValue, bottom);
      ctx.stroke();
    }
  }]
}

var ctx = document.getElementById('chartJSContainer').getContext('2d');
new Chart(ctx, options);
<body>
  <canvas id="chartJSContainer" width="600" height="400"></canvas>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.js"></script>
</body>

Related