【问题标题】:How to apply tooltips to elements in d3 nested layers (streamgraph)如何将工具提示应用于 d3 嵌套层中的元素(流图)
【发布时间】:2014-09-15 07:57:02
【问题描述】:

我正在尝试创建一个 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")

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript d3.js tooltip layer stream-graph


    【解决方案1】:

    嗯,这与我的想法不太一样,但我有一个解决方法,而不是将数据直接绑定到每条路径上。

    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");
    

    只是将其几乎直接附加到示例中。如果有人知道我仍然可以使用第一种方法,那就太好了:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多