Это ответ на этот вопрос, который я получил от Скотта Мюррея, автора замечательных вводных уроков для d3.js http://alignedleft.com/tutorials/d3/, которые очень помогли мне с пониманием его функциональности. Надеюсь, он не возражает против того, чтобы я дал ему свой ответ для всеобщего блага.
Большое спасибо Скотту!
И да, это абсолютно возможно. Взяв ваш пример, предположим, вы хотите нарисовать один набор кругов с набором данных, называемым «giraffeData», связанным с ними. Вы могли бы использовать:
svg.selectAll("circle")
.data(giraffeData)
.enter()
.append("circle");
Но тогда у вас есть второй набор данных (на самом деле просто массив значений) под названием «zebraData». Таким образом, вы можете использовать один и тот же код, но изменить которые набор данных вы ссылаетесь здесь:
svg.selectAll("circle")
.data(zebraData)
.enter()
.append("circle");
Конечно, это будет неосторожно выбрать все вы уже созданные круги и связать новые данные к ним - что не совсем что ты хочешь. Таким образом, вы должны помочь D3 различать круги жирафа и круги зебры. Вы можете сделать это путем присвоения им классов:
svg.selectAll("circle.giraffe")
.data(giraffeData)
.enter()
.append("circle")
.attr("class", "giraffe");
svg.selectAll("circle.zebra")
.data(zebraData)
.enter()
.append("circle")
.attr("class", "zebra");
Или, вы можете сгруппировать круги каждого типа в элемент а отдельный SVG «г»:
var giraffes = svg.append("g")
.attr("class", "giraffe");
giraffes.selectAll("circle")
.data(giraffeData)
.enter()
.append("circle");
var zebras = svg.append("g")
.attr("class", "zebra");
zebras.selectAll("circle")
.data(zebraData)
.enter()
.append("circle");
я бы выбрал последнее, так как тогда ваш DOM более организован, и вам не нужно добавлять класс в каждый круг. Вы могли бы просто знать, что любой круг внутри g с классной зеброй - это «круг зебры».
извините, непонятно, что вы хотите. Вы имеете в виду использование одного и того же списка данных, но сделать что-то вроде создания другого большего или меньшего прямоугольника для каждого из тех, что вы создали выше? – explunit
Что такое 'xScale()'? –
Я создаю серию прямоугольников, а затем хочу создать другие поверх предыдущего, чтобы отразить прогресс – Bartosz