ChartJS:在鼠标悬停时在图表上的数据点绘制垂直线

时间:2017-08-21 15:09:11

标签: javascript chart.js chartjs-2.6.0

我无法弄清楚当使用Chart JS将鼠标悬停在数据点上时,如何在折线图上绘制垂直线。我希望该线保持在图表矩形的范围内,以便它不会延伸到刻度区域。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:12)

目前还没有本机功能,相反,你必须创建一个图表插件才能完成。

ᴘʟᴜɢɪɴ(ᴅʀᴀᴡᴠᴇʀᴛɪᴄᴀʟʟɪɴᴇᴏɴᴍᴏᴜꜱᴇᴏᴠᴇʀᴅᴀᴛᴀ-ᴘᴏɪɴᴛ):

Chart.plugins.register({
   afterDatasetsDraw: function(chart) {
      if (chart.tooltip._active && chart.tooltip._active.length) {
         var activePoint = chart.tooltip._active[0],
             ctx = chart.ctx,
             y_axis = chart.scales['y-axis-0'],
             x = activePoint.tooltipPosition().x,
             topY = y_axis.top,
             bottomY = y_axis.bottom;
         // draw line
         ctx.save();
         ctx.beginPath();
         ctx.moveTo(x, topY);
         ctx.lineTo(x, bottomY);
         ctx.lineWidth = 2;
         ctx.strokeStyle = '#07C';
         ctx.stroke();
         ctx.restore();
      }
   }
});

*在脚本开头添加此插件

ᴅᴇᴍᴏ⧩

Chart.plugins.register({
   afterDatasetsDraw: function(chart) {
      if (chart.tooltip._active && chart.tooltip._active.length) {
         var activePoint = chart.tooltip._active[0],
            ctx = chart.ctx,
            y_axis = chart.scales['y-axis-0'],
            x = activePoint.tooltipPosition().x,
            topY = y_axis.top,
            bottomY = y_axis.bottom;
         // draw line
         ctx.save();
         ctx.beginPath();
         ctx.moveTo(x, topY);
         ctx.lineTo(x, bottomY);
         ctx.lineWidth = 2;
         ctx.strokeStyle = '#07C';
         ctx.stroke();
         ctx.restore();
      }
   }
});

var chart = new Chart(ctx, {
   type: 'line',
   data: {
      labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
      datasets: [{
         label: 'LINE',
         data: [3, 1, 4, 2, 5],
         backgroundColor: 'rgba(0, 119, 290, 0.2)',
         borderColor: 'rgba(0, 119, 290, 0.6)',
         fill: false
      }]
   },
   options: {
      responsive: false,
      scales: {
         yAxes: [{
            ticks: {
               beginAtZero: true
            }
         }]
      }
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
<canvas id="ctx" height="200"></canvas>

答案 1 :(得分:0)

即使有一个可以接受的答案,我还是想贡献一个我写的专门解决这个问题的插件。

chartjs行高注释插件

https://www.npmjs.com/package/chartjs-plugin-lineheight-annotation

有一些可导出的类,可以根据需要帮助您计算到数据点的顶部。此外,还有一个简单的API,您可以将其添加到图表的选项对象中

/// default values
lineHeightAnnotation: {
  // defaults to have line to the highest data point on every tick
  always: true,
  // optionally, only have line draw to the highest datapoint nearest the user's hover position
  hover: false,
  // colors of the line
  color: '#000',
  // name of yAxis
  yAxis: 'y-axis-0',
  // weight of the line
  lineWeight: 1.5,
   /// sets shadow for ALL lines on the canvas
  shadow: {
    // color of the shadow
    color: 'rgba(0,0,0,0.35)',
    // blur of the shadow
    blur: 10,
    /// shadow offset
    offset: {
      // x offset
      x: 0,
      // y offset
      y: 3
    }
  },
  // dash defaults at [10, 10]
  noDash: true,
}