d3.js – NVD3线图与实时数据

我有一个非常简单的线图用NVD3.js.我写了一个简单的重绘基于计时器,从我看过的例子,从我得到的错误

未捕获TypeError:无法读取未定义的属性“y”

JS是

var data = [{
        "key": "Long","values": getData()
    }];
    var chart;

    nv.addGraph(function () {
          chart = nv.models.cumulativeLineChart()
                      .x(function (d) { return d[0] })
                      .y(function (d) { return d[1] / 100 })
                      .color(d3.scale.category10().range());

        chart.xAxis
            .tickFormat(function (d) {
                return d3.time.format('%x')(new Date(d))
            });

        chart.yAxis
            .tickFormat(d3.format(',.1%'));

        d3.select('#chart svg')
            .datum(data)
            .transition().duration(500)
            .call(chart);

        nv.utils.windowResize(chart.update);

        return chart;
    });


    function redraw() {
        d3.select('#chart svg')
            .datum(data)
          .transition().duration(500)
            .call(chart);
    }

    function getData() {
        var arr = [];
        var theDate = new Date(2012,01,0);
        for (var x = 0; x < 30; x++) {
            arr.push([theDate.getTime(),Math.random() * 10]);
            theDate.setDate(theDate.getDate() + 1);
        }
        return arr;
    }

    setInterval(function () {
        var long = data[0].values;
        var next = new Date(long[long.length - 1][0]);
        next.setMonth(next.getMonth() + 1)
        long.shift();
        long.push([next.getTime(),Math.random() * 100]);
        redraw();
    },1500);

解决方法

第二回答(评论后)

我看着source for cumulativeLineChart.你可以看到在创建图表时创建的display.y属性.它依赖于私有方法:“indexify”.如果该方法的一些衍生物被公开,那么也许你可以在重绘前做一些像chart.reindexify()这样的事情.

作为临时解决方法,您可以在每次更新时从头重新创建图表.如果你删除转换,这似乎工作正常.示例jsfiddlehttp://jsfiddle.net/kaliatech/PGyKF/.

一个答案

我相信cumulativeLineChart有bug.看来,cumulativeLineChart会将一个display.y”属性动态添加到系列中的数据值.但是,当重新绘制系列中添加新值时,不会重新生成属性.我不知道如何做到这一点,虽然我是新来的NVD3.

你真的需要一个CumulativeLineChart,还是一条正常的折线图就足够了?如果是这样,我必须对你的代码进行以下更改:

>从cumulativeLineChart更改为lineChart
>从使用数据的二维数组转换为使用数据对象(具有x,y属性)

(我对NVD3不够熟悉,可以预测什么数据格式,2D阵列显然适用于初始加载,但我认为它不能用于后续的重绘,这可能与您所使用的相同问题有关cumulativeLineChart.我认为更改对象会修复cumulativeLineChart,但似乎没有.)

我也改变了以下,虽然不是那么重要:

>修改您的getData函数创建一个新的Date实例,以避免在日期增加时共享引用的意外后果.
>修改更新间隔函数,以y值与getData函数相同的范围内以日(不是几个月)为增量生成新数据.

这是一个工作的jsfiddle与这些变化:

> http://jsfiddle.net/kaliatech/4TMMD/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)