Я пытаюсь создать интерактивный потоковый график, который использует всплывающие подсказки в определенные моменты времени. указывает вот так. В некоторых точках данных есть текст, и именно здесь я рисую круги и отображаю данные, когда навожу курсор на круги.
Как сделать так, чтобы круги отображались для каждого элемента во всех слоях, в которых есть текст в соответствующем месте? Большая часть кода такая же, как и на первом графике, с небольшой модификацией кода ниже.
Также в файле data.csv, расположенном внизу первой страницы графика, есть дополнительный столбец под названием «мета». У большинства записей есть «---» в мета, но у некоторых есть реальный текст. Это те, которые я хочу отобразить и иметь возможность наводить курсор для получения информации.
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")
Любая помощь будет оценена по достоинству.