我尝试创建一个 Interactive Streamgraph ,在某些点使用工具提示 like this 。一些数据点中包含文本,这就是我将鼠标悬停在圆圈上时绘制圆圈并显示数据的位置。
如何为所有在其中包含文字的图层中的每个元素显示圆圈?大多数代码与第一个图形相同,下面的代码稍作修改。
另外,在第一个图表页面底部找到的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")
任何帮助都将不胜感激。
答案 0 :(得分:0)
这不是我的想法,但我有一个解决方法,而不是将数据直接绑定到每条路径上。
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");
将这几乎直接附加到示例上。如果有人知道我怎么还能做第一种很好知道的方法:)