Я использую d3.js для создания диаграммы пончиков с надписями снаружи. Используя некоторую тригонометрию, основанную на центроидах каждого фрагмента пирога, я помещаю метки.d3js Перераспределение меток вокруг круговой диаграммы
g.append("g")
.attr("class", "percentage")
.append("text")
.attr("transform", function(d)
{
var c = arc.centroid(d);
var x = c[0];
var y = c[1];
var h = Math.sqrt(x*x + y*y);
return "translate(" + (x/h * obj.labelRadius) + ',' + (y/h * obj.labelRadius) + ")";
}
)
.attr("dy", ".4em")
.attr("text-anchor", function(d)
{
return (d.endAngle + d.startAngle)/2 > Math.PI ? "end" : "start";
}
)
.text(function(d) { return d.data.percentage+"%"; });
То, что я в конечном счете, пытаюсь выполнить, чтобы изменить метки, которые находятся за пределами краев круговой диаграммы, чтобы предотвратить дублирование.
Один из способов я пытался решить эту проблему состоит в определении набора «опорные точки», где метки могут быть расположены, гарантируя, что они будут не перекрываются. Проблема заключается в сопоставлении центроидов с якорями и сохранении некоторого смысла визуального соответствия между срезами и ярлыками (особенно сложно, если срезы тонкие).
Изображение выше показывает возможное расположение анкеров (центроиды срезов показаны). С этими позициями невозможно совпадение.
Добавление сложности к проблеме заключается в том, что когда метки (они горизонтальные) расположены близко к верхней или нижней части пирога, они легче накладываются друг на друга, чем когда они находятся справа или слева от пирога ,
Любые идеи о том, как подойти к этой проблеме?
[EDIT] По предложению meetamit, я осуществил следующее:
.attr("dy", function(d)
{
var c = arc.centroid(d);
var x = c[0];
var y = c[1];
var h = Math.sqrt(x*x + y*y);
var dy = y/h * obj.labelRadius;
dy=dy*fontSizeParam*.14/heightParam);
return (dy)+"em";
})
Это помогает немного, и дает некоторое пространство для этикеток, до сих пор ищет решение, которое будет охватывать все случаи, хотя. ..
Не могли бы вы привести пример того, что у вас есть на jsfiddle? – Jonah
Я добавил изображение для ясности. Я не реализовал в коде «якорь» решение, так как я разработал на бумаге различные случаи, когда он может потерпеть неудачу. – Cenobyte321
Я вижу. В самом деле, у вас есть трудная проблема, и она действительно имеет мало общего с d3 как таковой: вы ищете общий алгоритм размещения меток на вашем графике. Можете ли вы сделать какие-либо предположения? Например, если бы все части были всего лишь зелеными и желтыми, просто не было бы хорошего способа разместить все ярлыки? Как насчет того, чтобы показывать ярлык только при наведении на части, которые ниже определенного размера? – Jonah