D3.JS-用于小倍数的不同域的不同轴

时间:2018-10-26 02:35:32

标签: javascript arrays d3.js svg axes

我正在根据此来源here建立一个小的倍数。非常类似于此处的示例-我的数据具有不同的类别和与之相关的数字。但是,我想为不同的图表使用不同的轴,并且在Y轴的域中设置有麻烦。

CSV如下所示:

year,category,number
January 2018,Core,6.19
February 2018,Core,5.38
March 2018,Core,4.44
January 2018,MerchandiseExports,9.1
February 2018,MerchandiseExports,4.48
March 2018,MerchandiseExports,-0.66'

我根据类别嵌套csv。

 // Nest data by subject.
    var categories = d3.nest()
        .key(function(d) { return d.category; })
        .entries(data);

我计算出域中这些类别中的最大值和最小值。

    categories.forEach(function(s) {
        s.max = d3.max(s.values, function(d) { return d.number; });
        s.min = d3.min(s.values, function(d) { return d.number; });
    });

我添加一条线路径

svg.append("path")
        .attr("class", "line")
        .attr("d", function(d) { y.domain([d.min - d.min / 5, d.max + d.min / 5]); return line(d.values); });

我被困在确定y轴设置的逻辑上。

yScale =  d3.scale.linear()
    .range([height, 0]).domain(#What I'm missing)

由于我已经计算了每个类别的最小值和最大值,因此应该进入该域。但是,我还没有弄清楚将特定类别域发送到域变量的逻辑。就像类别6.19是最大值,而4.44是最小值。如何将其发送到域?

我查看了几种可能的解决方案,但是this似乎很有前途-但我不明白这一点。

1 个答案:

答案 0 :(得分:-1)

当您需要绘制y轴时,请勿使用call(),而应使用each(),并在回调中修改比例并调用yAxis。

svg.append("g").attr("id", "yAxisG")
   .each( function (s) {
       var svg1 = d3.select(this);
       var d = svg1.datum();
       yScale.domain([d.min, d.max]);
       svg1.call(yAxis);
   });