在d3中查找多个数据维度的范围

问题描述 投票:0回答:3

如何使用三个不同的数据维度计算我的域的范围?请考虑以下数据:

var data = [
  {
    "Date":"10-10-2013",
    "High1" : 3049,
    "High2" : 2100,
    "high3" : 43
  },
  {
    "Date":"09-10-2013",
     "High1" : 3142,
    "High2" : 2010,
    "high3" : 23
  },
  {
    "Date":"08-10-2013",
    "High1" : 3099,
    "High2" : 2190,
    "high3" : 90

  }

我想为High1绘制一条线,为High3绘制另一条线,为High3绘制另一条线,因此需要找到所有组合的范围,以便为图形创建y轴。

javascript d3.js
3个回答
5
投票
var extents = ["High1", "High2", "high3"].map(function(dimensionName) {
    return d3.extent(data, function(d) { return d[dimensionName] });
});

var extent = [d3.min(extents, function(d) { return d[0] }),
              d3.max(extents, function(d) { return d[1] })];

这首先分别计算每个维度的范围,然后选择全局最小值和最大值。


1
投票

诀窍是使用d3.max和d3.min的访问器。

d3.max(data, function(d){
    return Math.max.apply(Math, [d.High1, d.High2, d.high3]);
})

d3.min(data, function(d){
    return Math.min.apply(Math, [d.High1, d.High2, d.high3]);
})

如果您不理解申请的使用,请参见JavaScript: min & max Array values?


0
投票

在@ValarDohaeris的基础上回答,为了使它稍微更通用并允许我使用过的不同数量的系列:

var extents = series.map(function(seriesName)
    {
        return d3.extent(data, function(d) { return d[seriesName]; });
    });

var yScale = d3.scaleLinear()
            .domain([d3.min(extents, function(d) { return d[0]; }),
                    d3.max(extents, function(d) { return d[1]; })])
            .range([height,0]);

其中'series'是包含数据中序列名称的数组。我在角度指令中使用它,允许我将任意数量的系列输入到折线图中

© www.soinside.com 2019 - 2024. All rights reserved.