Я бы рекомендовал вручную рисовать дуги с помощью path .
SVG
Во-первых, вот рабочий пример с дополнениями: https://jsfiddle.net/mztafs0w/
Пояснение:
SVG Path имеет такие команды, как M для M ove, A для A rc, L для отрисовки L in to:
- Заглавные буквы - абсолютные движения пикселей
- Строчные буквы - относительные перемещения пикселей
Чтобы создать заполненный круговой фрагмент с использованием SVG-пути, необходимо выполнить следующие действия:
источник изображения
Допустим, ваш радиус равен 40, и вы хотите срез для верхнего правого квадранта. Вся команда для этого будет:
- Переместить X (0) Y (-40) - перейти наверх
- Дуга Радиус X (40) Радиус Y (40) XRot (0)> 180 градусов? (0) Размах (1) X (40) Y (0) - дуга направо
- Линия X (0) Y (0) - возврат в центр
Сжатый в формат пути SVG, это выглядит как:
M 0 -40 A 40 40 0 0 1 40 0 L 0 0
(минимально M0,-40A40,40,0,0,1,40,0L0,0
)
Выполнить это 4 раза, чтобы получить все 4 квадранта, достаточно просто, а замена радиуса на $ {r} позволяет легко настроить размер.
Окончательный код, добавленный к вашей скрипте JS:
var slices=[];
slices[0] = node.append("path")
.attr("d", function(d) {
let r = d.type == "family" ? family_radius + 5 : 40;
return `M 0 -${r} A ${r} ${r} 0 0 1 ${r} 0 L 0 0`; } )
.attr("fill", "coral");
slices[1] = node.append("path")
.attr("d", function(d) {
let r = d.type == "family" ? family_radius + 5 : 40;
return `M ${r} 0 A ${r} ${r} 0 0 1 0 ${r} L 0 0`; } )
.attr("fill", "royalblue");
slices[2] = node.append("path")
.attr("d", function(d) {
let r = d.type == "family" ? family_radius + 5 : 40;
return `M 0 ${r} A ${r} ${r} 0 0 1 -${r} 0 L 0 0`; } )
.attr("fill", "olivedrab");
slices[3] = node.append("path")
.attr("d", function(d) {
let r = d.type == "family" ? family_radius + 5 : 40;
return `M -${r} 0 A ${r} ${r} 0 0 1 0 -${r} L 0 0`; } )
.attr("fill", "goldenrod");
Рекомендую удалить нерабочий раздел descriptionArc и сделать код более DRY . Вы можете выполнить больше вычислений, чтобы ломтики круга ломались в местах, отличных от 0/90/180/270. Дайте мне знать, если вам нужна помощь с любым из них, или вы можете проверить источник изображения для получения дополнительных советов.
Я также изменил family_radius на family_radius + 5, чтобы вы могли видеть дуги, нарисованные под белой заливкой этих меньших кругов. Если это нежелательно, вы можете либо удалить белую заливку на этих кружках (строка 165 if(d.type == "family"){return "white"}
), либо просто вообще не рисовать эти кусочки для этих кружков.