8

我正在使用 nvd3 绘制一个简单的折线图,其中数据通过 ajax 请求接收。它与第一个绘图请求完美配合,但不适用于重绘。图表通过调用相同的绘图函数但使用不同的数据 + 不同的最大/最小值来重绘。

使用新数据重新绘制图表时,不会出现“悬停圆圈”,而工具提示会出现。此外,当单击图表的图例并通过再次出现悬停来强制重绘时,但 yAxis 的值将更改为第一个绘制的图表的值。

到目前为止,我假设重绘图表时仍然保留旧的最大/最小值 - 但仅涉及“悬停”效果。到目前为止,一般图表在重绘时看起来也很好 - 问题只是面临悬停,就是这样。

听起来很混乱,但希望你能明白这一点。

一些代码:

 d3.json(queryurl, function(data2){
  nv.addGraph(function(jsonData) {
    if(chart){
       chart.remove();
    }
    chart = nv.models.lineChart()
                .x(function(d) { return d[0] })
                .y(function(d) { return d[1] })
                .color(d3.scale.category10().range());

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

    chart.yAxis
        .scale()
        .tickFormat(d3.format(''));

    chart.lines.yDomain([maxmin.max,maxmin.min]);

    d3.select('#chart1 #chartsvg')
      .datum(data2)
      .transition().duration(600)
      .call(chart);

    nv.utils.windowResize(chart.update);

});

});
  return chart;}
4

2 回答 2

4

在重绘之前尝试.empty()在 svg 元素上使用。

于 2013-04-26T20:59:04.370 回答
3

我自己才刚刚开始使用 NVD3 和 D3,但是我正在做类似的事情。对我有用的是将数据更新功能与图表创建功能分开。请注意下面的警告...

我有以下创建图表:

initGraph = function(url) {
  d3.json(url, function(data) {
    nv.addGraph(function() {
      chart = nv.models.multiBarChart();

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

      return chart;
    });
  });
};

以及更新它的以下功能:

redrawGraph = function(url) {
  d3.json(url, function(data) {

    d3.select('#chart svg').datum(data).transition().duration(500).call(chart);
    nv.utils.windowResize(chart.update);
  });
};

我不知道这是否是推荐的解决方案,因为我仍处于“破解直到它起作用”阶段。有了这个,图表的所有功能在调用redrawGraph()(包括轴重绘和工具提示)后工作。

警告:这似乎偶尔会导致重新计算时错误计算的刻度:假蜱

于 2013-01-26T22:32:21.823 回答