【问题标题】:Small multiples: how to add axis?小倍数:如何加轴?
【发布时间】:2019-04-07 00:03:27
【问题描述】:

有人知道如何在下面的示例中添加 y 轴吗? https://bl.ocks.org/mbostock/e1192fe405703d8321a5187350910e08

该示例展示了如何使用为每个数据系列动态计算的 yScale 一次生成多个图表。但是如何使用本地 yScale 将 yAxis 添加到每个图表?

【问题讨论】:

    标签: javascript d3.js svg axis


    【解决方案1】:

    鉴于您链接的示例,您唯一需要的是为每个 SVG 设置局部变量:

    axis.set(this, d3.axisRight(ty).ticks(3));
    

    在这里,我使用ticks(3),因为我们没有太多的垂直空间,ty 是为每个 SVG 创建的比例。然后,您稍后将该局部变量用作:

    svg.each(function(){
        axis.get(this)(d3.select(this)
            .append("g")
            .attr("transform", "translate(" + width + ",0)"));
    });
    

    这里是更新的 bl.ocks:https://bl.ocks.org/GerardoFurtado/7ce71db8470c75940feed0d64b3f1f25/fb38b0867f434268e254f08e469cf38113179472


    PS:注意我这里用的是……

    axisGenerator(groupSelection)
    

    ...而不是更传统的模式...

    groupSelection.call(axisGenerator)
    

    ...因为我们无法使用传统模式获得this。要使用没有each 方法的传统模式,您需要一个奇怪的辅助函数,例如:

    svg.append("g")
        .attr("transform", "translate(" + width + ",0)")
        .call(generateAxis);
    
    function generateAxis(selection) {
        selection.call(axis.get(selection.node()));
    };
    

    【讨论】:

    • 非常感谢!我实际上犯了两个错误。首先,我尝试使用匿名函数的“call”方法来调用axis,其次,我有更复杂的数据结构并从更深层次指向“this”axis.set(this,d3.axisRight(ty).ticks(3 ));是一个不正确的参考 - 将“this”更改为“this.parentNode”并使用“svg.each”方法解决了我的问题:) 再次感谢!
    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多