HTML есть
Есть только элементы группы (g), и они сами никогда не видны.В вашем исходном коде
var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
...
legend.append("rect")
legend
здесь выделено несколько элементов g.legend
, и, таким образом, прямоугольник добавляется к каждому из них, а также получает доступ к данным, привязанным кродительский г.Однако в вас новый код
var legend = d3.select("#legend").append("svg")
...
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
legend.selectAll(".legend")
.data(color.domain())
.enter().append("g")
...;
legend.append("rect")
legend
здесь относится только к одному элементу g
, который содержит всю вашу легенду.Ваш legend.selectAll(".legend")
не сохраняется в переменную, поэтому, находясь внутри цепочки, вы устанавливаете класс и правильно трансформируете атрибуты, вы не используете его для добавления к нему прямоугольника - опять же, legend
в этот момент относится к внешнему видуодин контейнер g.
Потенциальное решение:
var legendCnt = d3.select("#legend").append("svg")
.attr("width", $("#legend").width())
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var legend = legendCnt.selectAll(".legend")
.data(color.domain())
...
Вы заметите, что вам нужно удалить или опустить атрибут x для текста и прямоугольника, так как 0 теперь находится наначало легенды вместо диаграммы