【问题标题】:Moving vertical line when hovering over the chart using chart.js使用 chart.js 将鼠标悬停在图表上时移动垂直线
【发布时间】:2021-05-13 20:40:54
【问题描述】:

我一直在尝试添加一条垂直线,当鼠标悬停在图表上时,它会显示工具提示。但我使用的是chart.js 2.6,1.x 的语法似乎已经过时了。

以下代码适用于 1.x

var data = {
    labels: ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", 
"OCT", "NOV", "DEC"],
    datasets: [{
        data: [12, 3, 2, 1, 8, 8, 2, 2, 3, 5, 7, 1]
    }]
};

var ctx = document.getElementById("LineWithLine").getContext("2d");

Chart.types.Line.extend({
    name: "LineWithLine",
    draw: function () {
        Chart.types.Line.prototype.draw.apply(this, arguments);

        var point = this.datasets[0].points[this.options.lineAtIndex]
        var scale = this.scale

        // draw line
        this.chart.ctx.beginPath();
        this.chart.ctx.moveTo(point.x, scale.startPoint + 24);
        this.chart.ctx.strokeStyle = '#ff0000';
        this.chart.ctx.lineTo(point.x, scale.endPoint);
        this.chart.ctx.stroke();

        // write TODAY
        this.chart.ctx.textAlign = 'center';
        this.chart.ctx.fillText("TODAY", point.x, scale.startPoint + 12);
    }
});

new Chart(ctx).LineWithLine(data, {
    datasetFill : false,
    lineAtIndex: 2
});

http://jsfiddle.net/dbyze2ga/658/

任何人都知道如何使它适用于 2.6 https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js

【问题讨论】:

    标签: chart.js chart.js2


    【解决方案1】:

    ChartJS 2.6.0 解决方案

    ꜱᴄʀɪᴘᴛ (ᴇxᴛᴇɴᴅɪɴɢ ʟɪɴᴇ ᴄʜᴀʀᴛ)

    Chart.defaults.LineWithLine = Chart.defaults.line;
    Chart.controllers.LineWithLine = Chart.controllers.line.extend({
       draw: function(ease) {
          Chart.controllers.line.prototype.draw.call(this, ease);
    
          if (this.chart.tooltip._active && this.chart.tooltip._active.length) {
             var activePoint = this.chart.tooltip._active[0],
                 ctx = this.chart.ctx,
                 x = activePoint.tooltipPosition().x,
                 topY = this.chart.legend.bottom,
                 bottomY = this.chart.chartArea.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();
          }
       }
    });
    

    您还需要为工具提示设置 intersect: false

    ᴡᴏʀᴋɪɴɢ ᴇxᴀᴍᴘʟᴇ ⧩

    Chart.defaults.LineWithLine = Chart.defaults.line;
    Chart.controllers.LineWithLine = Chart.controllers.line.extend({
       draw: function(ease) {
          Chart.controllers.line.prototype.draw.call(this, ease);
    
          if (this.chart.tooltip._active && this.chart.tooltip._active.length) {
             var activePoint = this.chart.tooltip._active[0],
                 ctx = this.chart.ctx,
                 x = activePoint.tooltipPosition().x,
                 topY = this.chart.legend.bottom,
                 bottomY = this.chart.chartArea.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: 'LineWithLine',
       data: {
          labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'],
          datasets: [{
             label: 'Statistics',
             data: [3, 1, 2, 5, 4, 7, 6],
             backgroundColor: 'rgba(0, 119, 204, 0.8)',
             borderColor: 'rgba(0, 119, 204, 0.3)',
             fill: false
          }]
       },
       options: {
          responsive: false,
          tooltips: {
             intersect: 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>

    【讨论】:

    • 你介意让它在 jsfiddle 上工作吗?那我会批准的。
    • 如果线条堆叠在 Y 轴上似乎会出现问题。
    • 惊人的答案谢谢。复制和粘贴,它完美地工作。颜色/笔画粗细也很容易定制。
    • 它怎么会以 (x,y) 距离显示最近点的工具提示,而不是以 x 值显示最近的垂直线?例如,如果您将鼠标悬停在图表顶部,工具提示会从 Jan 跳转到 Apr
    • @Atav32 在 v2.7.0 中引入了一个设置来解决这个问题。您将axis: 'x' 设置为options.tooltips.axis。这是一个使用 v2.8.0 并设置了该设置的小提琴:jsfiddle.net/hg5873zm/2@ɢʀᴜɴᴛ 如果您可以更新答案,我建议您这样做:)
    【解决方案2】:

    试试这个:

    var ctx = this.$refs.canvas.getContext("2d");
          // new Chart(ctx, config);
          var originalLineDraw = Chart.controllers.line.prototype.draw;
          Chart.helpers.extend(Chart.controllers.line.prototype, {
            draw: function() {
              originalLineDraw.apply(this, arguments);
    
              var chart = this.chart;
              var ctx = chart.chart.ctx;
    
            if (this.chart.tooltip._active && this.chart.tooltip._active.length) {
              var activePoint = this.chart.tooltip._active[0];
              var ctx = this.chart.ctx;
              var x = activePoint.tooltipPosition().x;
              var topY = this.chart.scales['y-axis-0'].top;
              var bottomY = this.chart.scales['y-axis-0'].bottom;
    
             // draw line
              ctx.save();
              ctx.beginPath();
              ctx.moveTo(x, topY);
              ctx.lineTo(x, bottomY);
              ctx.lineWidth = 0.5;
              ctx.strokeStyle = '#eeeeee';
              ctx.stroke();
              ctx.restore();
           }
          }});
    

    这肯定会对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 2018-04-20
      • 2018-01-23
      • 2016-04-28
      • 1970-01-01
      相关资源
      最近更新 更多