Я использую библиотеку облака слов в D3 Джейсона Дэвиса. Это обычный код, который я использую, и он отлично подходит для создания словесных облаков.
d3.layout.cloud().size([width, height])
.words(d3.zip(vis_words, vis_freq).map(function(d) {
return {text: d[0], size: wordScale(d[1]) };
}))
.padding(1)
.rotate(function() { return ~~(Math.random() * 2) * 0; })
.font("times")
.fontSize(function(d) { return d.size; })
.on("end", draw)
.start();
function draw(words) {
d3.select(curr_id).append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width/2 + "," + height/2 + ")")
.selectAll("text")
.data(words)
.enter()
.append("text")
.transition()
.delay(function(d,i){
return i*100;
})
.duration(1000)
.ease("elastic")
.style("font-size", function(d) { return d.size + "px"; })
.style("font-family", "times")
.style("fill", function(d, i) { return fill(i); })
.attr("text-anchor", "middle")
.attr("transform", function(d) {
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
})
.text(function(d) { return d.text; });
}
У меня есть ползунок времени, чтобы выбрать конкретное значение, в зависимости от того, какие слова в облаке слов имеют разную частоту (заданную размером) или некоторых слов нет вообще. Мне нужно обновить, не перерисовывая все облако слов, что я сейчас делаю. В каком-то смысле я хочу сохранить положение слов фиксированным и просто обновлять их размер и существуют ли они на основе значения, выбранного на ползунке?
Должен ли я для этого вводить функцию обновления в отрисовку функции? Я, конечно, новичок в D3, и любая помощь будет отличной?