当前位置: 首页 > 知识库问答 >
问题:

图表js——对时间尺度数据集使用update()

梁骞仕
2023-03-14

Chart.js (v2.7.2) 似乎会为使用时间刻度的轴动态呈现折线图轴标签。这在更新数据集后使用 update() 方法时会产生一个独特的问题。

update() 启动一个以图表元素.determine数据限制方法结尾的跟踪:

// Convert labels to timestamps
for (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) {
    labels.push(parse(chart.data.labels[i], me));
}

因为我的数据中没有标签元素 - 每个数据集都有自己的标签,并且时间刻度标签是自动生成的 - 上面的代码有效地阻止了我在时间缩放图表上使用uped()

我尝试了结合使用< code > destroy()/< code > clear()和< code>render()来解决这个问题,但这导致了< code>Chart.transition中更奇怪的异常:

    transition: function(easingValue) {
        var me = this;

        for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {
            if (me.isDatasetVisible(i)) {
                me.getDatasetMeta(i).controller.transition(easingValue);
            }
        }

        me.tooltip.transition(easingValue);
    },

显然,me.getDatasetMeta(i).控制器未定义。

我试图做的是:

1)在这里渲染一个类似于官方示例的时间刻度折线图:http://www.chartjs.org/samples/latest/scales/time/line-point-data.html

2)通过AJAX检索全新的数据集

3)重新渲染折线图。

似乎< code>new Chart(context,config)构造函数是实际呈现时间刻度折线图的唯一方法。

我的质询分为两部分:

A) 这是一个错误,还是我做错了什么?

B) 无论 (A) 的答案如何,有没有其他方法可以做到这一点,而不会完全删除图表及其数据,并在其位置上呈现一个新图表?

共有1个答案

郎弘业
2023-03-14

简短的回答:我将原始图表保存为一个对象变量,我可以在其上调用 destroy()。调用 destroy() 后,我将新图表呈现到同一对象变量。

长答案(代码示例,从ES6源代码中提取):

updateTimeScaleChart() {
    this.timeScaleChart.destroy()
    this.drawTimeScaleChart()
},

drawTimeScaleChart() {
    this.timeScaleChart = new Chart($('#timeScaleChart'), {
        type: 'line',
        data: this.prepareTimeScaleChartData(),
        options: {
            aspectRatio: 1.25,
            title: {
                display: true,
                text: 'Measured over Time'
            },
            scales: {
                xAxes: [{
                    type: 'time',
                    scaleLabel: {
                        display: true,
                        labelString: 'Date'
                    }
                }]
            }
        }
    });
},

this.drawTimeScaleChart()当my组件在等待检索JSON API数据时最初使用空白数据呈现时调用。

this.prepareTimeScaleChartData()是一种将我的JSON API响应格式化为预期的ChartJS数据结构的方法

从那以后,只需为适当的事件触发< code > updateTimeScaleChart()即可。

 类似资料:
  • 我正在学习如何使用图表.js并且我想要一个图表,该图形以格式为“h?h:mm”在一天中的不同时间(x轴)显示随机值。 在 x 轴中,我想要一个小时的固定步骤,从上午 12 点 (0:00) 开始,到上午 8 点(8:00)结束。 和数据,例如(x=4:45,y=67)在te对应的x刻度(4:00和5:00之间的3/4) 我尝试了以下方法: 但这不是我想要的,因为 X 轴刻度线取标签的值(x 数据)

  • 我用图表js设置了一个折线图。在这张图中,我的点太大了,但这不是我的问题。有太多的点。 有没有办法限制点数? 每5分一分将是一个很好的解决方案。

  • 我想在图表中添加一个新数据,但浏览器在调用我的“add”函数时抛出一个错误,上面写着“UncaughtTypeError:undefined不是一个函数”。 图表对象似乎不识别“AddData”函数,但我不知道如何解决它。在文档中显示此函数对我来说无法正常工作。 .addData(valuesArray,label)在图表实例上调用addData(valuesArray,label),传递每个数据

  • 是寻求帮助的时候了。我已经学习D3.js好几个星期了,现在才开始觉得自己理解了它的10%(哈哈哈)。我正在尝试生成一个非常简单的线图。只要数据非常简单,我就能做到这一点,但是我的原始数据源有UTC时间戳,以及实数/十进制数字,这些数字总是使任何简单之外的东西崩溃。 原始数据源如下所示: 使用jQuery和javascript时间格式化函数,我可以组装以下简化的数据集: 下面是我的代码: 第一个错误

  • 本文向大家介绍使用js获取图片原始尺寸,包括了使用js获取图片原始尺寸的使用技巧和注意事项,需要的朋友参考一下 浏览器中显示的图片大小未必是他真实的高和宽,比如像下面这样,我们给他加上宽和高的样式 <img src="IE.png" style="width:25px;height:25px;">   这样在浏览器中显示的大小就是25px。那么我们如何获取图片的真实大小呢?,下面的代码就实现了这个

  • 我用图表js设置了一个折线图。 正如你所看到的,我有太多的数据点。有没有办法限制图表本身的点数,或者减少数据?此图的当前形式难以读取,对性能不利。