D3中具有剪辑路径的折线图的工具提示

时间:2015-07-07 03:01:19

标签: javascript d3.js charts data-visualization linechart

I have put together a D3 line chart并使用剪辑路径/剪辑添加阈值编码。我面临的唯一问题是我无法在此图表中添加工具提示。当我将鼠标悬停在图表中的任何位置时,我想要一个工具提示,并且图表上相应的y轴值显示在工具提示中。

enter image description here

我已使用此example by Mike Bostock添加了阈值编码。

 var line = d3.svg.line()
    .interpolate("basis")
    .x(function(d) { return _config.xScale(d.vtc); })
    .y(function(d) { return _config.yScale(d.values); });

          svg.append("clipPath")
      .attr("id", "clip-above")
    .append("rect")
      .attr("width", _config.width)
      .attr("height", _config.yScale(55));

  svg.append("clipPath")
      .attr("id", "clip-below")
    .append("rect")
      .attr("y", _config.yScale(55))
      .attr("width", _config.width)
      .attr("height", _config.height - _config.yScale(55));


  svg.selectAll(".line")
      .data(["above", "below"])
    .enter().append("path")
      .attr("class", function(d) { return "line " + d; })
      .attr("clip-path", function(d) { return "url(#clip-" + d + ")"; })
      .datum(data)
      .attr("d", line);

我不知道如何为此特定图表添加工具提示,因为路径上有剪裁矩形,路径分解为上下段以产生颜色效果。

enter image description here

我们是否有统一的方法将工具提示添加到正常路径和此路径?如果是,我想知道一些我可以看到的来源/链接。

this这样的东西,但不是那么复杂(在线上没有任何指标,只是工具提示)

My CODEPEN LINK

1 个答案:

答案 0 :(得分:0)

您可以为线添加mouseOver处理程序,并使用d3线性刻度的.invert函数将鼠标y位置转换回yAxis值。现在,您可以动态添加工具提示文本元素并将位置,值设置为

以下是更新后的Codepen link

注意:您仍然需要增加线的捕获区域。这可以通过在线上添加透明笔划来完成。

  svg.selectAll(".line")
    .data(["above", "below"])
    .enter().append("path")
    .attr("class", function(d) { return "line " + d; })
    .attr("clip-path", function(d) { return "url(#clip-" + d + ")"; })
    .datum(data)
    .attr("d", line)
  .on("mouseover", function() {
    var mousePos = d3.mouse(this);
    var yAxisValue = _config.yScale.invert(mousePos[1]);
    svg.selectAll(".tooltip").data([mousePos])
      .enter().append("text")
      .classed("tooltip", true)
      .attr("x", function(d) { return d[0]})
      .attr("y", function(d) { return d[1]})
      .text(yAxisValue); 
   })
   .on("mouseout", function() {
      svg.selectAll(".tooltip").data([]).exit().remove();
   });