[英]How to apply tooltips to elements in d3 nested layers (streamgraph)
我正在嘗試創建一個交互式Streamgraph ,該交互式Streamgraph在諸如此類的某些點使用工具提示。 一些數據點中包含文本,這就是我在圓圈上懸停時繪制圓圈並顯示數據的地方。
如何使圓圈顯示在其相應位置中所有帶有文本的圖層中的每個元素上? 大部分代碼與第一個圖形相同,下面的代碼略有修改。
此外,在第一個圖的頁面底部找到的data.csv文件還有一個稱為“元”的額外列。 大多數條目在meta中都有“ ---”,但有些條目具有實際文本。 這些是我要顯示的內容,並且可以將其懸停在該信息上。
svg.selectAll(".layer")
.on("mousemove", function(d, i) {
mousex = d3.mouse(this);
mousex = mousex[0];
var invertedx = x.invert(mousex);
invertedx = invertedx.getFullYear();
var selected = d.values;
for (var k = 0; k < selected.length; k++) {
datearray[k] = selected[k].date
datearray[k] = datearray[k].getFullYear();
}
mousedate = datearray.indexOf(invertedx);
pro = d.values[mousedate].value;
meta = d.values[mousedate].meta;
d3.select(this)
.classed("hover", true)
.attr("stroke", strokecolor)
.attr("stroke-width", "1px")
tooltip.html( function(){if(meta == "---") return "";else return "<p>" + d.key + "<br>" + pro + "<br>" + meta + "</p>";}).style("visibility", "visible")
.style("top", (event.pageY-30) + "px").style("left",(event.pageX+10)+"px")
.style("color", "black")
})
.on("mouseout", function(d, i) {
svg.selectAll(".layer")
.transition()
.duration(250)
.attr("opacity", "1");
d3.select(this)
.classed("hover", false)
.attr("stroke-width", "0px"), tooltip.html( "<p>" + d.key + "<br>" + pro + "<br>" + "hello" + "</p>" ).style("visibility", "hidden");
})
到目前為止,這只是我作為參考(不正確或不完整的:x)而已嘗試過的工作,我將其放在var graph函數中:
var circles = svg.selectAll("circle")
.data(layers).enter().append("circle")
.attr("x", function(d, i) {
for(var k = 0; k < d.values.length; k++){
//console.log(d.values[k].meta)
if(d.values[k].meta != "---")
return d.values[k].date
}
})
.attr("y", function(d, i) {
for(var k = 0; k < d.values.length; k++){
if(d.values[k].meta != "---")
return d.values[k].value
}
})
.attr("r", 2)
.style("fill", "black")
任何幫助,將不勝感激。
嗯,這並不是我的初衷,但是我有一個解決方法,而不是將數據直接綁定到每個路徑上。
var layers = stack(nest.entries(data));
...
...
...
var NumCircles = []
for(i = 0; i < layers.length; i++){
for(j = 0; j < layers[i].values.length; j++){
if(layers[i].values[j].meta != "---") {NumCircles.push([layers[i].values[j].date, layers[i].values[j].value + layers[i].values[j].y0-.03]);}
}
}
svg.selectAll("circle").data(NumCircles).enter().append("circle")
.attr("cx", function(d) { return x(d[0]);})
.attr("cy", function(d) { return y(d[1]);})
.attr("r", 4)
.style("fill", "red");
只需將其幾乎直接附加到示例中即可。 如果有人知道我仍然可以做第一種方法,那將是一件令人高興的事:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.