D3.js图表​​ - 在两行中显示图例

时间:2013-12-03 23:38:45

标签: svg d3.js

我有10个图例元素,我希望在D3.js图表​​的顶部显示两行。我试过以下

legend.append("rect").attr("width", 20).attr("height", 15).style("fill", function(d) {
return color(d.packageName);
});

legend.append("text").attr("dx", +25).attr("dy", "0.8em").style("text-anchor","front").style("fill", "#666").text(function(d) {
return d.packageName;
});

var margin = {
 top: 30,
 right: 20,
 bottom: 30,
 left: 40
};

d3.selectAll(".legend").each(function(d, i) {
  return d3.selectAll(".legend").attr("transform", i < 6 ? function(d, i) {
  return "translate(" + ((i * 100) + (diameter / 10) - 25) + "," + (+margin.top * 2) +")";
  } : function(d, i) {
  return "translate(" + ((i * 100) + (diameter / 10) - 25) + "," + (+margin.top * 4) +")";
 });
 });

我的目标是在“i”计数器超过5时更改y坐标,以便图例元素显示在2行5中。但上面的代码显示第二行中的所有图例元素。我确定我在这里错过了一些非常简单的东西!

1 个答案:

答案 0 :(得分:4)

我的解决方案:将所有内容放入“输入”方法,然后计算偏移量。

legend = svg.selectAll(".legend").data(data).enter().append("g")
   .attr("class", "legend")
   .attr( "transform", function(d,i) { 
        xOff = (i % 4) * 50
        yOff = Math.floor(i  / 4) * 10
        return "translate(" + xOff + "," + yOff + ")" 
} );

因此,您可以删除底部的整个“selectAll”和“each”部分。

更新小提琴:http://jsfiddle.net/v7mkg/1/

副作用;这个特定的实现可以创建很多行,但这不是问题的核心。