d3组合条形图中的工具提示X位置

时间:2016-09-06 14:36:13

标签: d3.js tooltip

我无法弄清楚为什么X位置总是好像我在上面悬停的栏位于第一组。

http://jsbin.com/xiboxupema/edit?js,console,output

不确定为什么这会被低估。我试图使用矩形的x属性来确定工具提示位置,但似乎总是相对于" group"设置。我该如何解决这个问题?

  state.selectAll("rect")
      .data(function(d) { return d.ages; })
      .enter().append("rect")
      .attr("width", x1.rangeBand())
      .attr("x", function(d) { return x1(d.name); })
      .attr("y", function(d) { return y(d.value); })
      .attr("height", function(d) { return height - y(d.value); })
      .style("fill", function(d) { return color(d.name); });

  state.selectAll("rect")
    .on("mouseover", function(d){

       var yPos = parseFloat(d3.select(this).attr("y"));
       var xPos = parseFloat(d3.select(this).attr("x"));
       var height = parseFloat(d3.select(this).attr("height"))
       var width = parseFloat(d3.select(this).attr("width"))

       console.log(xPos);

       d3.select(this).attr("stroke","red").attr("stroke-width",0.8);

       svg.append("text")
       .attr("x",xPos)
       .attr("y",yPos + height/2)
       .attr("font-family", "sans-serif")
       .attr("font-size", "10px")
       .attr("font-weight", "bold")
       .attr("fill", "black")
       .attr("text-anchor", "middle")
       .attr("id", "tooltip")
       .attr("transform", "translate(" + width/2 + ")")
       .text(d.name +": "+ d.value);

    })
    .on("mouseout", function(){
        svg.select("#tooltip").remove();
       d3.select(this).attr("stroke","pink").attr("stroke-width",0.2);

     });

编辑:

显然,它与我上一个问题中描述的问题不同。使用变换属性并不像堆叠条形图一样解决它,因为在堆积条形图中,所有矩形都在相同的X坐标中,而在分组中它们不是。每个组都被视为对象,因此获得转换将返回与最左边的条对齐但不与其余条对齐的点。现在,我能够通过获得变换并在组中添加每个条的x位置的值来获得其正确的x坐标来解决这个问题。请删除向下投票。

1 个答案:

答案 0 :(得分:-2)

啊得到了!

state.selectAll("rect")
    .data(function (d) { return d.ages; })
    .enter().append("rect")
    .attr("width", x1.rangeBand())
    .attr("x", function (d) { return x1(d.name); })
    .attr("y", function (d) { return y(d.value); })
    .attr("height", function (d) { return height - y(d.value); })
    .style("fill", function (d) { return color(d.name); });

state.selectAll("rect")
  .on("mouseover", function(d){

     var group = d3.select(d3.select(this).node().parentNode);
     var xPos = d3.transform(group.attr("transform")).translate[0] + x1(d.name);
     var yPos = parseFloat(d3.select(this).attr("y"));
     var height = parseFloat(d3.select(this).attr("height"))
     var width = parseFloat(d3.select(this).attr("width"))

     d3.select(this).attr("stroke","red").attr("stroke-width",0.8);

     svg.append("text")
     .attr("x",xPos)
     .attr("y",yPos + height/2)
     .attr("font-family", "sans-serif")
     .attr("font-size", "10px")
     .attr("font-weight", "bold")
     .attr("fill", "black")
     .attr("text-anchor", "middle")
     .attr("id", "tooltip")
     .attr("transform", "translate(" + width/2 + ")")
     .text(d.name +": "+ d.value);

  })
  .on("mouseout", function(){
      svg.select("#tooltip").remove();
     d3.select(this).attr("stroke","pink").attr("stroke-width",0.2);

   });