d3.js:数据集数组,带多个y轴值

d3.js:数据集数组,带多个y轴值,d3.js,D3.js,我完全是d3.js的初学者,所以请友善一点:) 我有以下数据集: 两个问题 d3是否提供了更好的方法来查找数据集数组中y轴数据(除第0列外的所有列,第0列是x轴(时间))的最大值?目前,我只是在整个数据集数组中循环并生成第二个数组,不包括第一列。也许除了我应该使用的数组之外,还有更好的数据结构 var data_arr = []; for (row in dataset){ for (col=1;col < dataset[row].length; co

我完全是d3.js的初学者,所以请友善一点:)

我有以下数据集:

两个问题

  • d3是否提供了更好的方法来查找数据集数组中y轴数据(除第0列外的所有列,第0列是x轴(时间))的最大值?目前,我只是在整个数据集数组中循环并生成第二个数组,不包括第一列。也许除了我应该使用的数组之外,还有更好的数据结构

        var data_arr = [];
    
        for (row in dataset){
            for (col=1;col < dataset[row].length; col++){
                data_arr.push(dataset[row][col]);
            }
        }
    
        var yScale = d3.scale.linear()
                             .domain([0, d3.max(data_arr)])
                             .range([h - padding, padding]);
    
  • 现在请查看带有代码的图形,了解完整上下文:
    感谢您的帮助

    我对您的示例做了一些更改,您可以在上看到结果

    首先,我稍微修改了你的数据。这主要是一种样式,但我发现使用对象而不是数组更容易:

            //Static dataset
            var dataset = [
              {x: d3.time.hour.utc.offset(now, -5), y1: 1, y2: 10}, 
              {x: d3.time.hour.utc.offset(now, -4), y1: 2, y2: 20},
              {x: d3.time.hour.utc.offset(now, -3), y1: 3, y2: 30},
              {x: d3.time.hour.utc.offset(now, -2), y1: 4, y2: 40},
              {x: d3.time.hour.utc.offset(now, -1), y1: 5, y2: 50},
              {x: now, y1: 6, y2: 60},
            ];
    
    然后您可以找到您的域和范围,如下所示:

    var xDomain = d3.extent(dataset, function(i) { return i.x; });
    var maxY = d3.max(dataset, function(i) { return Math.max(i.y1, i.y2); });  
    
    然后,要添加多个y值,只需附加一个带有适当值的附加圆。我给了他们不同的类,这样你可以用它来选择他们,如果你以后想做转换或更新的话

            //Create circles
            svg.selectAll(".y1")
               .data(dataset)
               .enter()
               .append("circle")
               .attr("cx", function(d) { return xScale(d.x); })
               .attr("cy", function(d) { return yScale(d.y1); })
               .attr("class", "y1")
               .attr("r", 2);
    
            //Create circles
            svg.selectAll(".y2")
               .data(dataset)
               .enter()
               .append("circle")
               .attr("cx", function(d) { return xScale(d.x); })
               .attr("cy", function(d) { return yScale(d.y2); })
               .attr("class", "y2")
               .attr("r", 2);
    
    var xDomain = d3.extent(dataset, function(i) { return i.x; });
    var maxY = d3.max(dataset, function(i) { return Math.max(i.y1, i.y2); });  
    
            //Create circles
            svg.selectAll(".y1")
               .data(dataset)
               .enter()
               .append("circle")
               .attr("cx", function(d) { return xScale(d.x); })
               .attr("cy", function(d) { return yScale(d.y1); })
               .attr("class", "y1")
               .attr("r", 2);
    
            //Create circles
            svg.selectAll(".y2")
               .data(dataset)
               .enter()
               .append("circle")
               .attr("cx", function(d) { return xScale(d.x); })
               .attr("cy", function(d) { return yScale(d.y2); })
               .attr("class", "y2")
               .attr("r", 2);