Предотвращение наложения текста в круговой диаграмме D3
Я гуглил, но не могу понять это.
Моя ситуация такова, что страны, когда они представлены на круговой диаграмме, перекрываются:
Это пример того, что происходит:
Я абсолютный новичок в D3
и пытаюсь предотвратить наложение текста. Есть ли атрибут текстового поля, который я могу добавить, чтобы мои метки не перекрывали друг друга?
2 ответа
Обновление: см. Ответ на вопрос D3 о размещении меток дуг в круговой диаграмме, если места достаточно для более комплексного решения.
Я не знаю какого-либо общего метода размещения текстовых элементов, чтобы они не перекрывались.
Тем не менее, существует решение для вашей проблемы, вращая метки и масштабируя график так, чтобы они не перекрывались: http://jsfiddle.net/2uT7F/
// Get the angle on the arc and then rotate by -90 degrees
var getAngle = function (d) {
return (180 / Math.PI * (d.startAngle + d.endAngle) / 2 - 90);
};
g.append("text")
.attr("transform", function(d) {
return "translate(" + pos.centroid(d) + ") " +
"rotate(" + getAngle(d) + ")"; })
.attr("dy", 5)
.style("text-anchor", "start")
.text(function(d) { return d.data.label; });
Еще одним решением было бы изменить порядок данных, в первую очередь США. Возможно, вы найдете угол наклона круговой разметки более читабельным.
var data_values = [48, 1, 1, 1, 1, 1, 1, 4];
var titles = ["USA","Pakistan", "Israel", "Netherlands", "Italy", "Uruguay", "United Kingdom", "Austria", "China"]
http://jsfiddle.net/rocky1616/oLzsrd4o/
Решение Musical_ut здесь также подойдет. Вы даже можете немного уменьшить угол, если это сработало в вашем дизайне.
var getAngle = function (d) {
return (180 / Math.PI * (d.startAngle + d.endAngle) / 2 + 45);
};
Вам нужно создать блок if else, чтобы позаботиться об элементе USA, но это начало, если это поможет.