gpt4 book ai didi

d3.js - 在 D3.js 中绘制多条线

转载 作者:行者123 更新时间:2023-12-03 07:25:07 25 4
gpt4 key购买 nike

到目前为止,我一直在使用循环将线条元素添加到 D3 可视化中,但这似乎不符合 API 的精神。

假设我有一些数据,

var data = {time: 1, value: 2, value2: 5, value3: 3,value4: 2},
{time: 2, value: 4, value2: 9, value3: 2,value4: 4},
{time: 3, value: 8, value2:12, value3: 2,value4:15}]);

我想要四行,时间作为所有 4 行的 X。

我可以做这样的事情:

var l = d3.svg.line()
.x(function(d){return xScale(d[keys[0]]);})
.y(function(d,i){
return yScale(d[keys[1]]);})
.interpolate("basis");
var l2 = d3.svg.line()
.x(function(d){return xScale(d[keys[0]]);})
.y(function(d,i){
return yScale(d[keys[2]]);})
.interpolate("basis");
var l3 = d3.svg.line()
.x(function(d){return xScale(d[keys[0]]);})
.y(function(d,i){
return yScale(d[keys[3]]);})
.interpolate("basis");
var l4 = d3.svg.line()
.x(function(d){return xScale(d[keys[0]]);})
.y(function(d,i){
return yScale(d[keys[4]]);})
.interpolate("basis");

然后将它们一一添加(或通过循环)。

var line1 = group.selectAll("path.path1")
.attr("d",l(data));
var line2 = group.selectAll("path.path2")
.attr("d",l2(data));
var line3 = group.selectAll("path.path3")
.attr("d",l3(data));
var line4 = group.selectAll("path.path4")
.attr("d",l4(data));

是否有更好更通用的方法来添加这些路径?

最佳答案

是的。首先,我将重组您的数据以便于迭代,如下所示:

var series = [
[{time: 1, value: 2}, {time: 2, value: 4}, {time: 3, value: 8}],
[{time: 1, value: 5}, {time: 2, value: 9}, {time: 3, value: 12}],
[{time: 1, value: 3}, {time: 2, value: 2}, {time: 3, value: 2}],
[{time: 1, value: 2}, {time: 2, value: 4}, {time: 3, value: 15}]
];

现在您只需要一个通用行:

var line = d3.svg.line()
.interpolate("basis")
.x(function(d) { return x(d.time); })
.y(function(d) { return y(d.value); });

然后,您可以一次性添加所有路径元素:

group.selectAll(".line")
.data(series)
.enter().append("path")
.attr("class", "line")
.attr("d", line);

如果你想让数据结构格式更小,你也可以将时间提取到一个单独的数组中,然后使用二维数组作为值。看起来像这样:

var times = [1, 2, 3];

var values = [
[2, 4, 8],
[5, 9, 12],
[3, 2, 2],
[2, 4, 15]
];

由于矩阵不包含时间值,因此您需要从行生成器的 x 访问器中查找它。另一方面,y 访问器被简化,因为您可以将矩阵值直接传递到 y 尺度:

var line = d3.svg.line()
.interpolate("basis")
.x(function(d, i) { return x(times[i]); })
.y(y);

创建元素保持不变:

group.selectAll(".line")
.data(values)
.enter().append("path")
.attr("class", "line")
.attr("d", line);

关于d3.js - 在 D3.js 中绘制多条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com