Прежде всего, если вы console.log данных (из .data(pie)
), которые вы использовали для отображения текстовой метки и значения, вы заметите, что доступ к метке возможен только через d.data.label
вместо data[i].label
.
{data: {label: "Frei Wähler", value: 3}, value: 3, startAngle: 1.304180706233562, endAngle: 1.5707963267948966, padAngle: 0.02}
Поэтому, чтобы правильно отображать как метку, так и значение, код должен быть:
arcs.append("svg:text")
.attr("class", "labels")//add a label to each slice
.attr("fill", "grey")
.attr("transform", function(d) {
var c = arc.centroid(d),
xp = c[0],
yp = c[1],
// pythagorean theorem for hypotenuse
hp = Math.sqrt(xp*xp + yp*yp);
return "translate(" + (xp/hp * labelr) + ',' +
(yp/hp * labelr) + ")";
})
.attr("text-anchor", "middle") //center the text on it's origin
.text(function(d, i) { return d.data.value; })
.text(function(d, i) { return d.data.label; });
Как добавить подсказку
Что касается того, как создать всплывающую подсказку d3, ей нужно немного css, html, а затем добавить обработку событий d3.
1) добавьте следующий html в ваш index.html:
<div id="tooltip" class="hidden"><p id="tooltip-data"></p></div>
2) добавить немного css, чтобы установить для div значение position:absolute
и скрыть всплывающую подсказку с помощью display:none
, и придать ей немного стиля в соответствии с вашими предпочтениями:
<style>
#tooltip {
position:absolute;
background: #ffffe0;
color: black;
width: 180px;
border-radius: 3px;
box-shadow: 2px 2px 6px rgba(40, 40, 40, 0.5);
}
#tooltip.hidden {
display:none;
}
#tooltip p {
margin: 0px;
padding: 8px;
font-size: 12px;
}
3) Затем мы добавляем обработчик событий mouseover
, идея в том, что когда мышь находится над диаграммой, мы установим свойства top
и left
стиля #tooltip
css, где находится мышь, и установите свойство css display
, чтобы показать подсказку.
//tooltip
arcs.on("mouseover", function(d) {
d3.select("#tooltip")
.style("left", `${d3.event.clientX}px`)
.style("top", `${d3.event.clientY}px`)
.classed("hidden", false);
d3.select("#tooltip-data")
.html(`Label: ${d.data.label}<br>Value: ${d.data.value}`);
});
arcs.on("mouseout", function(d) {
d3.select("#tooltip")
.classed("hidden", true);
});