Ищете способ отображения меток на диаграмме солнечных лучей (не могу найти рабочий пример)

Благодаря чьей-то помощи (Брэндон) я смог добавить всплывающие подсказки к диаграммам солнечных лучей. Я все еще ищу способ отобразить метку пути на диаграмме солнечных лучей (а затем всплывающую подсказку двойного режима + текст).

Пример, который я хотел бы улучшить, представлен на jsfiddle.net/trakkasure/UPqX5/

Я ищу код для добавления в следующий раздел кода:

path = svg.data([getData()]).selectAll("path") 
    .data(partition.nodes)
    .enter().append("svg:path")  
    .attr("d", arc)  
    .style("fill", function(d) { return color((d.children ? d : d.parent).name); })  
    .on("click", magnify)  
    .on("mouseover", function(d) {  
    tooltip.show([d3.event.clientX,d3.event.clientY],'<div>'+d.name+'</div>  <div>'+d.value+'</div>')
    })  
    .on('mouseout',function(){  
    tooltip.cleanup()
    })              
    .each(stash);

И я хотел бы видеть метки, как показано в примере, предоставленном на http://bl.ocks.org/910126. Я не могу заставить этот пример работать на меня (я все еще новичок в D3)

Я понимаю, что на этом графике может быть слишком много текста, но в моем сценарии это не проблема.

Может кто-нибудь помочь мне понять, как отобразить все эти метки на графике?

1 ответ

Просто добавьте элементы svg:text на холст:

path.append("svg:text")
  .attr("transform", function(d) { return "rotate(" + (d.x + d.dx / 2 - Math.PI / 2) / Math.PI * 180 + ")"; })
  .attr("x", function(d) { return d.y; })
  .attr("dx", "6") // margin
  .attr("dy", ".35em") // vertical-align
  .text(function(d) { return d.name; });

Однако, в моем редакторе, это сломает ваш magnify функция, поэтому я создаю группу SVG, чтобы держать вместе каждую пару пути и текста. На мой взгляд, элементы лучше организованы таким образом, что их легче запрашивать в будущем.

Обратите внимание, что вам нужно изменить magnify Функция также анимирует текст, так как на данный момент она только анимирует путь и оставляет текст в исходном положении.

group = svg.data([getData()]).selectAll("path")
  .data(partition.nodes)
  .enter().append('svg:g');

//path variable is required by magnify function
path = group.append("svg:path")
  .attr("d", arc)
  .style("fill", function(d) { return color((d.children ? d : d.parent).name); })
  .on("click", magnify)
  .on("mouseover", function(d) {
    tooltip.show([d3.event.clientX,d3.event.clientY],'<div>'+d.name+'</div><div>'+d.value+'</div>')
  })
  .on('mouseout',function(){
    tooltip.cleanup()
  }) 
  .each(stash);

// you may need to assign the result to a variable, 
// for example to animate the text in your magnify function, 
// as shown in the path variable above
group.append("svg:text")
  .attr("transform", function(d) { return "rotate(" + (d.x + d.dx / 2 - Math.PI / 2) / Math.PI * 180 + ")"; })
  .attr("x", function(d) { return d.y; })
  .attr("dx", "6") // margin
  .attr("dy", ".35em") // vertical-align
  .text(function(d) { return d.name; });

Код был взят из вашего приведенного примера, однако я отредактировал x приписать в .attr("x", function(d) { return d.y; }) правильно расположить текст на основе вашей структуры данных (в примере используется Math.sqrt(d.y)). Я также изменяю text функция для возврата d.name

вот jsFiddle

Другие вопросы по тегам