Как сохранить круги внутри SVG при обновлении данных в пузырьковой диаграмме

Я пытаюсь добавить взаимодействие в пузырьковую диаграмму и обновить данные, нажимая соответствующую кнопку. Но когда я нажимаю на кнопку, что-то идет не так, круги выходят за границы svg. Я не могу понять, как это исправить. Пожалуйста помоги!

Вот рабочий Plunk. (Попробуйте 2006,2007 или 2008)

function changebubble(i) {

d3.csv("count_s.csv", function(csvData) {

pack.value(function(d){var valuedata=[d.count2006, d.count2007, d.count2008];
return valuedata[i];});

var data = { name: "city", children: csvData };

var node = svg.data([data]).selectAll("circle")
  .data(pack.nodes);

var nodeEnter=node.enter().append("g")
    .attr("class", "node").attr("cx",0).attr("cy",0)
    .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });


nodeEnter.append("title")
    .text(function(d) { return d.city+ " : " +format(d.value); });


nodeEnter.append("circle")
    .attr("r", function(d) { return d.r; })
    .style("fill", function(d) { return color(d.city); });


 nodeEnter.append("text")
    .attr("dy", ".3em")
    .style("text-anchor", "middle")
    .text(function(d) { return d.city });

node.select("circle")
    .transition().duration(1000)
   .attr("r", function(d) { return d.r; })
    .style("fill", function(d) { return color(d.city); });

 node.transition().attr("class", "node")
    .attr("transform", function (d) {
     return "translate(" + d.x + "," + d.y + ")";
});

 node.select("text")
    .transition().duration(1000)
    .attr("dy", ".3em")
    .style("text-anchor", "middle")
    .text(function(d) { return d.city });

node.select("title")
.transition().duration(1000)
 .text(function(d) { return d.city+ " : " +format(d.value); });

node.exit().remove();

 });

 }

function updateBubble1() {changebubble(0);}
function updateBubble2() {changebubble(1);}
function updateBubble3() {changebubble(2);}

d3.select("#count2006").on("click",updateBubble1);
d3.select("#count2007").on("click",updateBubble2);
d3.select("#count2008").on("click",updateBubble3);

Большое спасибо!

1 ответ

Решение

Есть некоторые проблемы с вашей функцией обновления, чтобы назвать пару больших:

  • Элементы, которые вы выбираете (var node = svg2.selectAll("circle")) не совпадают с элементами, которые вы вводите (var nodeEnter=node.enter().append("g")). Это приводит к проблемам при определении ключевых функций и выполнении соединений данных
  • Вы, кажется, пытаетесь перепривязать данные при переходе существующих элементов (node.select("circle").data(pack.nodes,function(d) {return d.city})) Это вызовет проблемы - данные уже привязаны к этим элементам, и на этом этапе повторное связывание не требуется.

Я сделал обновления для вашего кода здесь: http://plnkr.co/edit/pYQTCOKWXoRM3ZE0HEt3?p=preview

Другие вопросы по тегам