【问题标题】:ChartJS: Draw vertical line at data point on chart on mouseoverChartJS:鼠标悬停时在图表上的数据点绘制垂直线
【发布时间】:2017-08-21 15:09:11
【问题描述】:

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

【问题讨论】:

    标签: javascript chart.js chartjs-2.6.0


    【解决方案1】:

    目前还没有本机功能,您必须创建一个图表插件来完成此操作。

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

    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>

    【讨论】:

    • 正是我想要的。谢谢!
    • 这太棒了。它也可以在点击事件上完成,因为这是在悬停/工具提示操作上?
    • 谢谢,这太棒了,每个人都想把它复杂化,但这很简单。再次感谢
    • 感谢您的回答。我想要一条虚线,所以我在ctx.beginPath(); 之后添加了ctx.setLineDash([3, 3]);。
    【解决方案2】:

    即使有一个公认的答案,我想我可能会贡献一个我写的插件来专门解决这个问题。

    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,
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      相关资源
      最近更新 更多