定义行中的空/空对零/ 0

时间:2018-01-30 09:00:16

标签: javascript html csv d3.js

我有一个显示多个堆积区域和线条的图表。我希望堆积区域停在某一点,然后从那里继续行。

我通过在我正在使用的CSV中保留空值并将此行添加到每个行/区域变量来实现此目的:

.defined(function(d) {return d.prioFinishA;})

这有一段时间了,但是存在一个很大的问题。这也会过滤0值。因此,如果我在CSV中的某处有零,它会将其视为缺失值,并在该点处打破行/区域。考虑到我希望我的所有行都以0值结束,这是一个很大的问题。

我找到了一个小的解决方法,它使用的是:0.00001而不是0,这非常接近,但这是一个非常难看的“解决方案”。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这里的问题不是行生成器,而是行函数。让我们看看:

您正在使用行功能(我可以在您删除的答案中看到它)将字符串转换为数字,如下所示:

function type(d) {
  d.foo = +d.foo
  return d;
}

问题在于,当您执行此操作以清空值时,一元加上将它们转换为零:



console.log(+"")




因此,您无法在defined中使用正确的功能,如this comment中所述,即:

.defined(function(d) {return d.prioFinishA !== "";})

看一下这个演示,我正确地使用了defined,但是行函数将空字符串更改为零:



var svg = d3.select("svg");
var csv = `col,value
1,40
2,30
3,100
4,60
5,
6,
7,90
8,120
9,100`;

var data = d3.csvParse(csv, function(d) {
  d.col = +d.col;
  d.value = +d.value;
  return d;
});

var scale = d3.scaleLinear().range([150, 0]).domain([0, 150])

var lineGen = d3.line()
  .x(d => d.col * 30)
  .y(d => scale(d.value))
  .defined(function(d) {
    return d.value !== ""
  })

var line = svg.append("path")
  .attr("fill", "none")
  .attr("stroke", "teal")
  .attr("stroke-width", 2)
  .attr("d", lineGen(data));

<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>
&#13;
&#13;
&#13;

因此,我们必须检查行函数,如果值是空字符串,如果不是,则强制转换为数字。您可以使用if(最好,因为更具可读性)或使用:

d.foo = d.foo && +d.foo;

以下是与此更改相同的演示,现在空字符串不显示:

&#13;
&#13;
var svg = d3.select("svg");
var csv = `col,value
1,40
2,30
3,100
4,60
5,
6,
7,90
8,120
9,100`;

var data = d3.csvParse(csv, function(d) {
  d.col = +d.col;
  d.value = d.value && +d.value;
  return d;
});

var scale = d3.scaleLinear().range([150, 0]).domain([0, 150])

var lineGen = d3.line()
  .x(d => d.col * 30)
  .y(d => scale(d.value))
  .defined(function(d) {
    return d.value !== ""
  })

var line = svg.append("path")
  .attr("fill", "none")
  .attr("stroke", "teal")
  .attr("stroke-width", 2)
  .attr("d", lineGen(data));
&#13;
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>
&#13;
&#13;
&#13;