0

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

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 绘制一条线,为 High2 绘制一条线,为 High3 绘制一条线,因此需要找到所有组合的范围,以便我可以为我的图表创建 y 轴。

4

3 回答 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] })];

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

于 2013-11-07T19:27:18.650 回答
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:最小和最大数组值?如果您不了解 apply 的用法。

于 2013-11-07T19:14:05.690 回答
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]);

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

于 2017-12-19T21:35:45.043 回答