【问题标题】:transitioning rotated axis labels with D3使用 D3 转换旋转轴标签
【发布时间】:2015-02-24 15:18:25
【问题描述】:

我正在尝试创建一个随着新值进入而更新的图表。为了使 X 轴上的标签可读,我决定稍微旋转它们,这样它们就不会重叠。

当有一个新值时,它被绘制在图表中,然后路径(实际上是容器)在转换中向左平移。

这就是我创建旋转轴标签的方式:

    svg.select(".x.axis")
        .call(this.xAxis)
        .selectAll("text")
            .style("text-anchor", "end")
            .attr("dx", "-.8em")
            .attr("dy", ".15em")
            .attr("transform", this.axislabelrotation);

this.axislabelrotation 是:

function(d) {
    return "rotate(-35)" 
}

这就是我转换 X 轴的方式:

    svg = svg.transition().duration(750);
    svg.select(".x.axis") // change the x axis
        .call(this.xAxis)
        .selectAll("text")
            .style("text-anchor", "end")
            .attr("dx", "-.8em")
            .attr("dy", ".15em")
            .attr("transform", this.axislabelrotation);

虽然现在我有两个问题:

  1. 在过渡开始时,X 轴标签会向下跳几个像素,在过渡期间它们会向上跳。
  2. 新输入的标签(示例中为“2015”)在过渡开始时不会旋转,但会在过渡期间旋转到所需的状态。

示例: http://jsfiddle.net/esy6wk8n/2/

【问题讨论】:

  • 嗯,问题是 D3 轴不旋转标签。您可以尝试自定义补间,在每个步骤中旋转标签。
  • ... 或者复制+粘贴并修改d3.svg.axis() 源代码以创建您自己的自定义轴。

标签: d3.js transition axis-labels


【解决方案1】:

我建议您删除 dytransform 属性上的转换。

这个更新的小提琴可能会帮助你:http://jsfiddle.net/esy6wk8n/4/

所有更改都在您的update 函数中。

    var no_trans = svg;
    svg = svg.transition().duration(750);

    lp.transition()
        .duration(750)
        .attr("transform", "translate(" + this.x(data[0].jdate) + ")");

    lu.transition()
        .duration(750)
        .attr("transform", "translate(" + this.x(data[0].jdate) + ")");

    svg.select(".x.axis") // change the x axis
        .call(this.xAxis)
        .selectAll("text")
            .style("text-anchor", "end")
            .attr("dx", "-.8em");
            //.attr("dy", ".15em")
            //.attr("transform", this.axislabelrotation);

    no_trans.select(".x.axis")
        .selectAll("text")
            .attr("dy", ".15em")
            .attr("transform", this.axislabelrotation);

基本上,我已将 dytransform 属性的更新移出转换,因此这些值将立即设置并且不会作为转换的一部分进行更改,同时保留 dytransform 在整个过渡过程中保持稳定。

【讨论】:

  • 哇。我不知道在您告诉 d3 在过渡内绘制它之后,您可以在过渡之外更改轴。 并且 d3 会在过渡时考虑这些更改...
  • 所有这些基本上都是立即设置dytransform 属性,而不是让过渡随着时间的推移对其进行插值。这里没有什么特别的。添加元素并设置dytransform 然后转换其他属性也没有什么不同,顺序并不重要,这只是代码影响最小的最简单方法。
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
相关资源
最近更新 更多