{
const svg = d3.create("svg")
.attr("width",width)
.attr("height",height);
svg.append("g").call(xAxis);
svg.append("g").call(yAxis);
svg.append("path")
.datum(data)
.attr("fill", "none")
.attr("stroke", "#ff006e")
.attr("stroke-width", 1.5)
.attr("d", function(d) { return line(d) });
var tooltip_g = svg.append("g")
.style("visibility", "hide")
var tooltip_txt_date = tooltip_g.append("text")
.attr("y", -32)
.text("texto...");
var tooltip_txt_close = tooltip_g.append("text")
.attr("y", -12)
.attr("x", 12)
.text("texto..");
// 5. Agregamos un componente que se encarge de atender los eventos del mouse y mostrar el tooltip.
// El gráfico de línea requiere una estrategia diferente a la hora de visualizar tooltips.
// En el ejemplo del círculo, simplemente bastaba con asociar la aparición y desaparición del
// tooltip a los eventos del mouse de ese círculo. En este caso, no tenemos componentes individuales
// para cada dato, solo una larga y única linea. Por eso, una alternativa que es crear componentes,
// en este caso, rectángulos invisibles, que abarcan todo el alto del gráfico, pero que de ancho solo
// abarcan pares de puntos contiguos. Luego, asociamos a cada rectángulos los eventos de aparición y
// desaparición del tooltip. Además, lo desplazamos hasta la posición correspondiente.
svg.append("g")
.attr("fill", "none")
.attr("pointer-events", "all")
.selectAll("rect")
.data(d3.pairs(data)) // Retorna pares de elementos sucesivos: https://observablehq.com/@d3/d3-pairs
.join("rect") // Creamos rectángulos invisibles por los que pase el mouse para detectar el evento
.attr("x", function([a]) { return x(a.date); })
.attr("height", height)
.attr("width", function([a, b]) { return x(b.date) - x(a.date); })
.on("mouseover", function([a]) {
tooltip_g.style("visibility", "visible"); // Visibilidad del tooltip
tooltip_g.attr("transform", `translate(${x(a.date)},${y(a.close)})`); // Desplazo
tooltip_txt_date.text(formatDate(a.date)); // Le seteamos el texto correcto
tooltip_txt_close.text(formatClose(a.close)); // Le seteamos el texto correcto
d3.select(this).style("fill","red").style("opacity",0.5)
})
.on("mouseout", function() {
tooltip_g.style("visibility", "hide");
d3.select(this).style("fill","none")
});
// 6. Retornamos el canvas
return svg.node();
}