Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svg D3.js图表-以两行显示图例_Svg_D3.js - Fatal编程技术网

Svg D3.js图表-以两行显示图例

Svg D3.js图表-以两行显示图例,svg,d3.js,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").sty

我有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) +")";
 });
 });
legend.append(“rect”).attr(“width”,20)。attr(“height”,15)。style(“fill”,function(d){
返回颜色(d.packageName);
});
图例.append(“text”).attr(“dx”)和+25.attr(“dy”,“0.8em”).style(“text-anchor”,“front”).style(“fill”,“#666”).text(函数(d){
返回d.packageName;
});
var保证金={
前30名,
右:20,,
底数:30,
左:40
};
d3.选择全部(“.图例”)。每个(功能(d,i){
返回d3.selectAll(“.legend”).attr(“transform”,i<6)函数(d,i){
返回“translate”(+((i*100)+(diameter/10)-25+”,“+(+margin.top*2)+”);
}:功能(d,i){
返回“translate”(+((i*100)+(diameter/10)-25)+”,“+(+margin.top*4)+”);
});
});

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

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

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”部分

更新小提琴:


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

我的解决方案:将所有内容都放在“enter”方法中,然后计算偏移量

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”部分

更新小提琴:


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

建议将其放到fiddle()中进行修补。我最初的想法是,三元运算符返回一个函数,而它应该返回一个字符串。谢谢你的建议。我在这里只对文本进行了简化。尝试在提琴中显示两行3,建议将其张贴在提琴()中进行修补。我最初的想法是,三元运算符返回一个函数,而它应该返回一个字符串。谢谢你的建议。我在这里只对文本进行了简化。尝试在小提琴中显示两排3,非常感谢!这非常有效,而且更加简单。令人惊叹的!我的“每一次”迭代都是一个非常丑陋的方法:PThanks一吨!这非常有效,而且更加简单。令人惊叹的!我的“每次”迭代都是一种非常丑陋的方法:P