【问题标题】:d3.js right align nested bar chartd3.js 右对齐嵌套条形图
【发布时间】:2014-02-22 21:08:11
【问题描述】:

我正在与this d3.js example 合作,并希望将图表的整个方向更改为从右到左。

我能够反转 x 轴刻度:

var x = d3.scale.linear().range([width, 0]);

以及y轴的位置:

svg.append("g").attr("class", "y axis")
               .attr("transform", "translate("+width+", 0)")
               .append("line").attr("y1", "100%");

我相信我必须将每个条形上的转换设置为图表宽度 - 条形宽度但是对包含的 g 应用任何转换都没有效果。

 function bar(d) {
    var bar = svg.insert("g", ".y.axis")
                 .attr("class", "enter")
                 .attr("transform", "translate(0,5)")
                 .selectAll("g")
                 .data(d.children)
                 .enter().append("g");
  //DOESNT WORK
  bar.attr("transform", function(n){ return "translate("+ (width - x(n.value)) +", 0)"; })  
     .style("cursor", function(d) { return !d.children ? null : "pointer"; })
     .on("click", down);

  bar.append("text")....

  bar.append("rect")....

  return bar;
} 

bar 上没有设置任何转换,即使我只是用一个固定值进行测试,结果页面中的结果也是 translate(0,0)。

为什么不在这里应用变换,这甚至是使条正确对齐的正确方法吗?我还需要将文本放在栏的右侧而不是左侧,似乎更改附加顺序在这方面没有任何区别。

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    这个特定示例的问题在于代码有点混乱——rect 元素的位置设置在各种不明显的地方。特别是,您正在设置的转换会立即被其他代码覆盖。

    我已经修改了示例以执行您想要的操作here。关键是我将包含所有条形的g 元素向右移动

    var bar = svg.insert("g", ".y.axis")
      .attr("class", "enter")
      .attr("transform", "translate("+width+",5)")
    .selectAll("g")
    // etc
    

    并将rect 元素的x 位置设置为它们的负宽度

    bar.append("rect")
      .attr("x", function(d) { return width-x(d.value); })
      .attr("width", function(d) { return x(d.value); })
      .attr("height", barHeight);
    

    x 位置需要以这种方式设置在代码中的其他几个位置 - 几乎可以肯定有更优雅的方法可以做到这一点。

    【讨论】:

    • 谢谢,效果不太一样,因为过渡仍然来自右侧,它会跳出图表,但稍后我会让某人修复它。非常感谢:)
    • 嘿 Lars 正确的计算是 attr("x", function(d) { return x.scale(d.value) - width; }.attr("width", function(d) { return width - x(d.value); }) 否则值被反转(即 30 变为“距离最大值 30”)
    • 所以这取决于你如何翻译容器元素——至少在修改后的例子中一切都应该正常工作,不是吗?
    • 乍一看,是的。在数据层面,不完全是。请注意“vis”条在一个示例中是最小的,而在另一个示例中是最大的。我评论中的计算会将其反转。我确实希望有人能找到更优雅的方式并在这里发帖:)
    • 我很抱歉——你完全正确。我会更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多