d3js не будет рисовать круги, используя массив данных

#javascript #svg #d3.js

#javascript #svg #d3.js

Вопрос:

У меня есть SVG-чертеж d3js, который я делаю следующим образом:

d — это массив, содержащий записи типа

   var d=[{"x":370,"y":40,"label":"Label 1"},    
        {"x":370,"y":150,"label":"Label 2"} ];
  

и код для d3 выглядит так

     // here el is my HTML element and width/height are sizes
    var svg=d3.select(el).append('svg')
    svg.attr({width: width, height: height});

    // this works just fine
            svg.append("circle") // attach a circle
                .attr("cx", 200) // position the x-center
                .attr("cy", 100) // position the y-center
                .attr("r", 50);
    //  now trying to plot that 'd' array

            svg.data(d)
                .enter().append("circle")
                .attr("cy", function (d) {                    
                    return d.y
                })
                .attr("cx", function (d) {

                    return d.x
                })
                .attr("r", 10);
  

последняя инструкция не будет создавать элементы svg. Ошибок тоже не отображается. Функции внутри «cy» / «cx» вызываются нормально. Пожалуйста, дайте мне понять проблему.

Ответ №1:

К сожалению, мой d3 немного заржавел, но вы, похоже, пропустили selectAll . Вместо этого попробуйте следующее:

 svg.selectAll("*").data(d)
    .enter().append("circle")
    .attr("cy", function (d) {                    
        return d.y
    })
    .attr("cx", function (d) {
        return d.x
    })
    .attr("r", 10);
  

Взгляните на jsFiddle здесь, чтобы увидеть это в действии; из того, что я могу сказать, selectAll используется для фильтрации любых значений, которые могут уже существовать. Даже с "*" помощью селектора CSS никакие значения не совпадают, поэтому используются все элементы из d .

Комментарии:

1. В качестве отступа (поэтому не является частью прямого ответа) bost.ocks.org/mike/join по видимому , дает хороший опыт в использовании selectAll .

2. На самом деле у меня есть следующий вопрос: если я рисую какой-то второй набор, я не могу использовать selectAll(«*»), поскольку это мешает предыдущему рисунку. Что я должен делать?

3. Не могу сказать со 100% уверенностью, но попробуйте .selectAll(".first") и .selectAll(".second") , как (плохой) пример. Если это не сработает, задайте его как новый вопрос.