【问题标题】:D3.JS - Different axes for different domains for small multiplesD3.JS - 小倍数的不同域的不同轴
【发布时间】:2019-03-30 17:40:31
【问题描述】:

我正在构建一个从这个来源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 是一个看起来很有希望的解决方案 - 但我不明白这一点。

【问题讨论】:

    标签: javascript arrays d3.js svg axes


    【解决方案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);
       });
    

    【讨论】:

    • 谢谢!这行得通!但我不确定 json 中的数据如何通过数据进入变量 d。域的设置,然后为每个 svg 单独调用是有意义的。
    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多