【问题标题】:How to continue line when data is null or zero?数据为空或零时如何继续行?
【发布时间】:2019-02-09 20:48:11
【问题描述】:

注意:我使用的是 d3 v5

我正在创建一个图表来表示我的一些团队历史数据。缺少某些时间段的数据,我该如何插值甚至只是继续两个非空数据值之间的线?

我尝试过使用已定义,但这会导致数据出现空白,并且我也尝试过将数据作为空值简单地传递到 d3 中,但它的处理方式与我传入零的方式相同。 这是我的图表示例,其中数据作为空值传入,而不是使用定义。

这是我的图表示例,其中数据仍为 null 并使用已定义。

这是我用来生成行的代码

types.forEach(function (val) {
    var line = d3.line()
        .x(function (d) {
            return xScale(d.date);
        }) // set the x values for the line generator
        .y(function (d) {
            return yScale(d[val]);
        });
    // 9. Append the path, bind the data, and call the line generator
    svg.append("path")
        .datum(data) // 10. Binds data to the line
        .attr("stroke", colors[val])
        .attr("class", "line") // Assign a class for styling
        .attr("d", line); // 11. Calls the line generator
});

我的最终目标是,如果数据存在差距,则在两个最接近的非空值之间画一条直线。

2/11/19 编辑:

我尝试了下面提到的,我没有在我的数据集中自动包含所有值,只包括那些有值的值。

这是我的数据的摘录。

var data = [{
    date: "9/28/2017",
    value1: 117.043121149897,
    value2: 133.88090349076,
    value3: 131.279945242984
}, {
    date: "9/29/2017",
    value1: 117.316906228611,
    value2: 133.88090349076,
    value3: 131.279945242984
}, {
    date: "11/7/2017",
    value1: 117.864476386037,
    value2: 134.907597535934,
    value3: 130.800821355236,
    value4: 166.666666666667,
    value5: 168.195300022815
}, {
    date: "11/8/2017",
    value1: 117.864476386037,
    value2: 134.907597535934,
    value3: 130.800821355236,
    value4: 195.893223819302,
    value5: 168.195300022815
}, {
    date: "11/9/2017",
    value1: 117.864476386037,
    value2: 134.907597535934,
    value3: 130.869267624914,
    value4: 195.893223819302,
    value5: 168.195300022815
}];

如您所见,我只包含有效数字时的值,但因为我已经这样做了,所以我在图表生成方面遇到了问题。它似乎不喜欢缺少值,因为该行一旦遇到缺失值就会停止生成,对于某些行来说,这是立即发生的,而其他行会在稍后发生。

这是当前的图表:

这是我当前代码的块:https://blockbuilder.org/ctooley21/c4c455c20eea8d7018e92bd3c348d35e javascript 数组是用 c# asp.net 动态生成的

【问题讨论】:

  • 可以在传递给 d3 之前用缺失的日期和平均值填充数组
  • 永远不会缺少任何日期,只有没有设置某些值的日期。我想我可能可以在传递给 d3 之前做到这一点,但我希望 d3 有办法在本地做到这一点
  • 原理相同.... 用基于前一个和下一个有效值的平均值填充缺失值属性
  • 只需从数据集中删除这些点,您就会得到点之间的连接线
  • @ctooley17 你不需要计算平均值或类似的东西,实际上你不需要做任何事情!只需将您拥有的数据数组传递给线生成器,路径就会连续地从一个点跳到另一个点。我们在完全相反的情况下使用define() 方法,即当我们不希望行从一个数据点跳转到下一个数据点时。因此,只需按原样传递数据,而无需某些日期的值。另一方面,如果您收到的数据数组已经包含空值,只需将它们过滤掉。

标签: javascript d3.js


【解决方案1】:

这里的问题可以通过您的数据结构来解释:您拥有大量对象中的所有内容,但并非每个对象都有workstationlaptoptabletmacOS、@987654328 @ 和 display 属性。正因为如此,当您以您正在使用的方式使用行生成器时,您有undefined(更多内容见下文),这将产生NaNs 和大量错误(检查您的控制台)。

无需过多重构代码的最简单解决方案是过滤循环内每个属性的数据:

var thisData = data.filter(function(d){
    return d[val];
});

这里是更新的块构建器:https://blockbuilder.org/GerardoFurtado/bdd84ce289f7868183681e4d631e1488

PS:根据经验,不要在 D3 代码中使用循环来追加元素。

【讨论】:

  • 谢谢!因此,为了获得最佳实践,我应该将每一行数据分成各自的数组?
  • 哦,我不需要任何帮助。我只是确保这是 d3 标准
猜你喜欢
  • 2018-08-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多