#javascript #html #d3.js
#javascript #HTML #d3.js
Вопрос:
У меня проблема, когда я могу добавить текст, SVG
но когда я хочу его изменить, я, похоже, не могу выбрать его для изменения. Код над d3.select("button")
all работает так же хорошо, как bar.transition
и . Может кто-нибудь помочь мне понять, как выбрать "text"
, чтобы при нажатии кнопки он использовал новый набор данных?
var bar = svg.selectAll("rect")
.data(dataset)
.enter();
bar.append("rect")
.attr("x", function(d) {
return xScale(d[0]);
})
.attr("y", function(d) {
return yScale(d[2]);
})
.attr("width", xScale.bandwidth())
.attr("height", function(d) {
return height - yScale(d[2]);
})
.attr("class", function(d) {
var s = "bar ";
if (d[2] < 50) {
return s "bar1";
} else if (d[2] < 100) {
return s "bar2";
} else {
return s "bar3";
}
});
bar.append("text")
.attr("dy", "1.3em")
.attr("x", function(d) {
return xScale(d[0]) xScale.bandwidth() / 2;
})
.attr("y", function(d) {
return yScale(d[2]);
})
.attr("text-anchor", "middle")
.attr("font-family", "sans-serif")
.attr("font-size", "11px")
.attr("fill", "black")
.text(function(d) {
return d[2];
});
d3.select("button")
.on("click", function() {
var dataset = [
['Jun-19', 8.6, 21.7],
['Jul-19', 8.68, 17.98],
['Aug-19', 8.9, 25.38],
['Sep-19', 6.38, 11.6],
['Oct-19', 10.36, 65.08],
['Nov-19', 22.36, 125.72],
['Dec-19', 26.52, 112.22],
['Jan-20', 21.08, 76.1],
['Feb-20', 6, 44, 19.625],
['Mar-20', 4.68, 8.95],
['Apr-20', 7.4, 15.94],
['May-20', 7.36, 18.36]
];
bar = svg.selectAll("rect")
.data(dataset);
bar.transition()
.attr("x", function(d) {
return xScale(d[0]);
})
.attr("y", function(d) {
return yScale(d[2]);
})
.attr("width", xScale.bandwidth())
.attr("height", function(d) {
return height - yScale(d[2]);
})
.attr("class", function(d) {
var s = "bar ";
if (d[2] < 30) {
return s "bar1";
} else if (d[2] < 60) {
return s "bar2";
} else {
return s "bar3";
}
});
svg.selectAll("text")
.data(dataset)
.transition()
.attr("dy", "1.3em")
.attr("x", function(d) {
return xScale(d[0]) xScale.bandwidth() / 2;
})
.attr("y", function(d) {
return yScale(d[2]);
})
.attr("text-anchor", "middle")
.attr("font-family", "sans-serif")
.attr("font-size", "11px")
.attr("fill", "black")
.text(function(d) {
return d[2];
});
});
Я пробовал использовать bar.selectAll("text")
, но он вообще не работает, но если я использую svg.selectAll("text")
его, он снимает галочки с моего Axis.Left
и перемещает его.
Комментарии:
1.
svg.selectAll("text")
не делает различий между галочками или другим текстом, попробуйте присвоить текст, который вы хотите, классу a, и выберите по этому классу, когда вы хотите обновить, в качестве альтернативы, вы можете создать ag
для хранения текста и обновленных столбцов и выбрать с помощьюg.selectAll("text")
Ответ №1:
Вы не можете добавлять text
узлы как дочерние rect
узлы узлов — поэтому SVG, вероятно, никогда не отображается. Попробуйте использовать g
узел для каждой строки и добавить к нему оба rect
и. text
barContainer
Например, вы можете присвоить ему класс.
Что касается выбора text
и игнорирования значений из осей, сделайте так, как сказал @Andrew Reid в своем комментарии и используйте barContainer.selectAll("text")
. В качестве альтернативы вы можете присвоить всем меткам класс label
, а затем использовать svg.selectAll(".label")
.