Chart.js - 鼠标悬停导致图形闪烁和调整大小

Chart.js - Mouseover causes graphs to flicker and resize

首先,I have made a short video to show exactly what I'm running into

总结视频:在使用 Chart.js (2.6.0) 时,我可以毫无问题地创建图表;但是当我将鼠标悬停在 bars/points 上时,图表将调整其元素的大小并闪烁。奇怪的是它完全不一致。有时当我刷新时,它根本没有这种行为;但是如果我将鼠标悬停在某个东西上并且它开始执行它,它不会停止,直到我再次刷新或关闭选项卡(这也与此不一致)。发生这种情况时,我不会更改代码中的任何内容,它会自行完成。

为了修复它,我在此处引用了许多其他线程以及 Chart.js 文档。在我的解决方案中:我已经指出要将指定的 Height/Width 添加到 Divs & Canvas 创建图形;设置Animation duration为0,Hover Animation duration为0,Responsive Animation duration为0;我确保响应设置为真,并保持纵横比保持为真,更改了工具提示模式……我已经尝试了所有这些,以及其他似乎几乎没有效果的小东西。

我难住了!

这是我的图表代码之一(没有我如何获取 JSON 数据等,只是图表):

new Chart($("#runwayChart"), {
    type: "horizontalBar",
    data: {
        labels: runwayLabels,
        datasets: [{
            label: "Months Left", fill: true,
            backgroundColor: "#3333ff",
            borderColor: "#3333ff",
            data: score
        }, {
            label: "Expenses",
            fill: true,
            backgroundColor: "#aa2222",
            borderColor: "#aa2222",
            data: expenses
        }, {
            label: "Revenue",
            fill: true,
            backgroundColor: "#2222aa",
            borderColor: "#2222aa",
            data: revenues
        }]
    },
    options: {
        tooltips: {
            mode: 'index'
        },
        responsive: true,
        maintainAspectRatio: true,
        animation: {
            duration: 0,
        },
        hover: {
            animationDuration: 0,
        },
        responsiveAnimationDuration: 0
    }
});

如果大家能提供帮助,我将不胜感激!

谢谢=)

试试这个:

   var myLineChart = null;

           function createChart() {
               var ctx1 = document.getElementById("barcanvas").getContext("2d");
               myLineChart = new Chart(ctx1, {
                   type: 'horizontalBar',
                  data: {
                        labels: runwayLabels
                        , datasets: [{
                            label: "Months Left"
                            , fill: true
                            , backgroundColor : "#3333ff" 
                            , borderColor: "#3333ff"
                            , data: score
                            }, {
                            label: "Expenses"
                            , fill: true
                            , backgroundColor : "#aa2222"
                            , borderColor: "#aa2222"
                            , data: expenses
                            }, {
                            label: "Revenue"
                            , fill: true
                            , backgroundColor : "#2222aa"
                            , borderColor: "#2222aa"
                            , data: revenues
                            }]
                    }
                   options:
                       {
                           scales: {
                               xAxes: [{
                                   ticks: {
                                       callback: function (tick) {
                                           var characterLimit = 20;
                                           if (tick.length >= characterLimit) {
                                               return tick.slice(0, tick.length).substring(0, characterLimit - 1).trim() + '...';
                                           }
                                           return tick;
                                       }
                                   }
                               }]
                           },

                           tooltips: {
                               callbacks: {
                                   // We'll edit the `title` string
                                   title: function (tooltipItem) {
                                       // `tooltipItem` is an object containing properties such as
                                       // the dataset and the index of the current item

                                       // Here, `this` is the char instance

                                       // The following returns the full string
                                       return this._data.labels[tooltipItem[0].index];
                                   }
                               }
                           },

                           title:
                           {
                               display: true,
                               text: "Your Chart Title"
                           },
                           responsive: true,
                           maintainAspectRatio: true
                       }
               });
           }

这实际上是一个非常简单而奇怪的解决方案。

当数据点靠近图表顶部时,图表会尝试根据 div 调整大小。由于图表位于较大的 canvas 中,将其放入自己的 div 中解决了这个问题。

<div>
    <canvas id="chart"></canvas>
</div>

像这样格式化就是解决方案 =)

我看到已经有一段时间没有人对此写过回复了 post。我通过应用两个东西解决了我的闪烁问题。

第一个 当我声明我使用的图表时:

var ctx = document.getElementById('chart').getContext('2d'); window.chart = new Chart(ctx, {}) ...

而不是var chart = new Chart(ctx, {})..

通过这种方式,我们确保图表已附加到 window。对象。

其次

在绘制新图表之前(例如更新数据)我们需要确保之前的canvas已经被销毁。我们可以使用以下代码进行检查:

if(window.chart && window.chart !== null){ window.chart.destroy(); }

我的 angular 应用程序(angular v6 和 chartjs 2.9.4)也有同样的问题。 添加延迟并在重绘图表之前销毁图表实例后解决了我的问题。

public redraw() {
    setTimeout(() => {
      if (this.chart && this.chart != null) {
        this.chart.destroy()
      }
      this.chart = new Chart(this.chartId, this.chartConfig);
    }, 500);
  }