我有一个显示多个堆积区域和线条的图表。我希望堆积区域停在某一点,然后从那里继续行。
我通过在我正在使用的CSV中保留空值并将此行添加到每个行/区域变量来实现此目的:
.defined(function(d) {return d.prioFinishA;})
这有一段时间了,但是存在一个很大的问题。这也会过滤0值。因此,如果我在CSV中的某处有零,它会将其视为缺失值,并在该点处打破行/区域。考虑到我希望我的所有行都以0值结束,这是一个很大的问题。
我找到了一个小的解决方法,它使用的是:0.00001而不是0,这非常接近,但这是一个非常难看的“解决方案”。
提前感谢您的帮助!
答案 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;
因此,我们必须检查行函数,如果值是空字符串,如果不是,则强制转换为数字。您可以使用if
(最好,因为更具可读性)或使用:
d.foo = d.foo && +d.foo;
以下是与此更改相同的演示,现在空字符串不显示:
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;