【问题标题】:Transition height stacked bar chart过渡高度堆积条形图
【发布时间】:2018-01-25 11:19:37
【问题描述】:

我这里有一个密码笔 - https://codepen.io/anon/pen/GybENz

我创建了一个带有图例的简单堆积条形图来过滤图表。

我想从底部轴向上动画栏的高度。

目前它的动画从左到下

let layersBar = layersBarArea.selectAll('.layer').data(stackedSeries)
    .enter()
    .append('g')
    .attr('class', 'layer')
    .style('fill', (d, i) => {
        return colors[i];
    });

layersBar.selectAll('rect')
    .data((d) => {
        return d
    })

    .enter()
    .append('rect')

    .attr('height', 100)
    .transition()
    .duration(400)
    .attr('height', (d, i) => {
        return y(d[0]) - y(d[1]);
    })

    .attr('y', 0)
    .attr('y', (d) => {
        return y(d[1]);
    })

    .attr('x', (d, i) => {
        return x(d.data.date)
    })

    .attr('width', x.bandwidth());
}

【问题讨论】:

    标签: d3.js


    【解决方案1】:

    设置x 位置、width、y 位置(作为基线)和高度(作为零)在过渡之前:

    .attr('height', 0)
    .attr("y", h - margin.bottom - margin.top)
    .attr('x', (d, i) => {
        return x(d.data.date)
    })
    .attr('width', x.bandwidth())
    

    这里是更新后的 CodePen:https://codepen.io/anon/pen/ypdoMK?editors=0010

    PS:最好单独过渡每个矩形。例如,如果用户点击了usedInf,您应该只转换那些矩形...但是,既然您这样做了...

    layersBarArea.selectAll('g.layer').remove();
    

    ...在您的 drawChart 函数的开头,这是一种错误的方法,这样的建议将需要一个很大的重构,超出了这个问题/答案的范围。

    【讨论】:

    • 你能解释一下为什么layersBarArea.selectAll('g.layer').remove(); 是错误的方法吗?这是一个选项还是会给我带来问题。我确实在另一个问题中问过如何解决这个问题,但没有得到回应
    • 进入/退出/更新选择的整个逻辑是更新图表。但是,每次函数运行时,您都会擦除所有内容并重新绘制所有内容!
    • 所以我的方法会中断,或者它不会像它可能的那样好。这样做最好,我要问什么问题
    • 这不是一个问题。这涉及了解如何在 D3 中创建这些选择。不幸的是,您不能在 Stack Overflow 上寻求教程。我建议您查看一些有关 D3 或其他资源的书籍,搜索“进入/退出/更新选择”。是的,你的方法不好,在几种情况下都会失败。
    • 是的,y位置和高度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2019-06-03
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多