javascript - 如何更新 D3 中的多折线图数据?

标签 javascript d3.js

我挑选了几个不同的例子来尽可能地了解。我有一个由对象提供的简单的两线折线图。为了进行测试,我创建了一个函数,通过在末尾添加新的数据点来增加数据。我希望我的图表能够反射(reflect)这些新增内容。

什么有效:

  • 数据被添加到对象中。
  • 单击按钮时,YScale 会调整

什么不起作用:

  • XScale 不会针对新数据进行调整。
  • 团队 1 线会调整团队 2 线的数据,然后沿 Y 轴进行相应缩放。

真是一团糟。就在我以为我理解了 D3 的时候,数据整合让我感到谦卑!

这是一些代码和 a mostly-working fiddle .

更新:这是an updated fiddle让它按预期工作。我知道 D3 使很多事情变得更容易,因此,虽然它有效,但我正在寻找一种更优雅的方式来获得相同的结果。

我的数据格式...

//SET SAMPLE DATA
var data = [{
  "team": "Team 1",
  "score": 0,
  "elapsedTime": 0
}, {
  "team": "Team 1",
  "score": 2,
  "elapsedTime": 3
}, 
    ...
{
  "team": "Team 2",
  "score": 18,
  "elapsedTime": 60
}];

我的更新功能...

function updateChart(){
    //SPLIT UPDATED DATA OBJECT INTO TWO TEAMS
    dataGroup = d3.nest()
    .key(function(d) {
      return d.team;
    })
    .entries(data);

  //DRAW LINES
  dataGroup.forEach(function(d, i) {

    // Select the section we want to apply our changes to
    var vis = d3.select("#visualisation").transition();

    xScale.domain([0, d3.max(data, function(d) {
      return d.elapsedTime;
    })]);
    yScale.domain([0, d3.max(data, function(d) {
  return d.score;
    })]);

    //PROBLEM: Team 1 line changes to Team 2's data
    vis.select("#line_team1")  
      .duration(750)
      .attr("d", lineGen(d.values));
    });

    vis.select("#line_team2")
        .duration(750)
      .attr("d", lineGen(data));

    // X-SCALE NEVER ADJUSTS
    vis.select(".x.axis") // change the x axis
      .duration(750)
      .call(xAxis);

    // Y-AXIS SEEMS TO SCALE AS EXPECTED
    vis.select(".y.axis") // change the x axis
      .duration(750)
      .call(yAxis);
};

任何见解将不胜感激!

最佳答案

进一步简化代码的一种方法是将其更改为基于数据本身进行更新。

我经常使用的一个方法是从数据本身获取用于更新数据的选择器。在您的情况下,您可以使用 dataGroup 对象的 key 属性:

dataGroup.forEach(function(d, i) {
  vis.select("#line_"+d.key.toLowerCase().split(' ').join(''))
    .duration(750)
    .attr("d", lineGen(d.values));

  var maxi = d3.max(data, function(d) {
    return d.elapsedTime;
  });
  ...
});

或者您可以在 d3.nest() 调用中进行预处理,以获取 team1 形式的 key 并将其用作选择器。

这是你的 fiddle 的一个分支带有工作示例。

关于javascript - 如何更新 D3 中的多折线图数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36879767/

相关文章:

javascript - 如何使用文本 <input> 框更改 window.location url

javascript - JS Promises - 为什么我会看到 UnhandledPromiseRejectionWarning 和 DeprecationWarning?

javascript - CSS/Jquery 效果 - 这是什么?

d3.js - 如何在D3中的单次数据迭代中绘制多个项目?

javascript - data.key 未定义 : how to parse json data

javascript/omniture - 如何清除一个对象(对象)的所有属性

javascript - 如何从浏览器发送 http 删除请求?

javascript - 在拖动事件 D3 上旋转矩形

javascript - 错误 : <path> attribute d: Expected number, "MNaN,NaNLNaN,NaN"

javascript - 在map.arc()中循环Json对象