Я использую библиотеку wordcloud Джейсона Дэвиса для d3 (https://github.com/jasondavies/d3-cloud) и моя проблема в том, что слова в облаке перекрываются.
Я знаю, что уже есть вопросы по этой проблеме с переполнением стека (и на других сайтах), но в моем случае ни один из них не помог.
В следующем примере я использовал пример облака с сайта Джейсона Дэвиса и изменил только несколько вещей:
- Я читаю свои слова и их размеры из внешнего файла.
- Я установил вращение на 0. Угол поворота, похоже, не имеет значения.
- Я закомментировал шрифт «Impact», чтобы исключить любые проблемы с загрузкой шрифта. (Хотя это тоже не имеет значения.)
Вот мой код:
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="d3.js"></script>
<script src="d3.layout.cloud.js"></script>
<script>
d3.tsv("testdata.txt",
function(error, data) {
var fill = d3.scale.category20();
d3.layout.cloud().size([300, 300])
.words(data)
.padding(1)
.rotate(function(d) { return 0; })
// .font("Impact")
.fontSize(function(d) { return d.size; })
.on("end", draw)
.start();
function draw(words) {
d3.select("body").append("svg")
.attr("width", 300)
.attr("height", 300)
.append("g")
.attr("transform", "translate(150,150)")
.selectAll("text")
.data(words)
.enter().append("text")
.style("font-size", function(d) { return d.size + "px"; })
// .style("font-family", "Impact")
.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.word; });
}
}
)
</script>
Тестовые данные выглядят следующим образом (информация о цвете в примере не используется):
word size color
der 39 #a9a9a9
die 37 #a9a9a9
und 30 #a9a9a9
athenischen 29 #a9a9a9
Die 29 #a9a9a9
eine 28 #a9a9a9
, 27 #a9a9a9
einer 26 #a9a9a9
attischen 26 #a9a9a9
liberalen 26 #1e90ff
zur 25 #a9a9a9
athenische 24 #a9a9a9
christliche 23 #a9a9a9
attische 23 #a9a9a9
_START_ 22 #a9a9a9
reinen 22 #a9a9a9
englischen 21 #a9a9a9
oder 21 #a9a9a9
-- 21 #a9a9a9
radikalen 21 #a9a9a9
Q*M 21 #a9a9a9
Q*M 21 #a9a9a9
christlichen 20 #a9a9a9
schöne 20 #1e90ff
repräsentativen 20 #a9a9a9
sozialen 20 #a9a9a9
hellenische 19 #1e90ff
modernen 19 #a9a9a9
radikale 19 #a9a9a9
griechische 19 #a9a9a9
- 18 #a9a9a9
schönen 18 #1e90ff
alle 18 #a9a9a9
radicalen 18 #a9a9a9
als 17 #a9a9a9
neuen 17 #a9a9a9
perikleischen 16 #a9a9a9
bürgerlichen 16 #a9a9a9
Namen 16 #1e90ff
Если я запускаю js-скрипт с тестовыми данными, мое облако слов выходит с перекрытиями. Иногда это происходит только после нескольких перезагрузок, но довольно часто.
Другие люди сообщили о той же проблеме и обнаружили, что она связана с использованием веб-шрифтов или пропуском параметра поворота. В моем примере это не применяется.
Я подозреваю, что это может быть связано с тем фактом, что для размера холста слишком много слов, однако я также провел тесты, в которых я значительно увеличил размер холста, и это все равно происходило (хотя и реже, поскольку случайное размещение слов сделал это менее вероятным). Кроме того, вы можете видеть, что некоторые слова вообще не отображаются из-за небольшого размера холста. Зачем оставлять одни и создавать дублирование других? Так что я думаю, проблема в другом.
Любые идеи?
Спасибо!