d3 js栏鼠标悬停

d3 js bar mouseover

我需要帮助来显示包含栏中所有值的工具提示,例如: 编排:1 帕拉多:3 trabajo1: 3 trabajo2: 2 这里我就放实际代码吧。

<!DOCTYPE html>
<html>
    <head>
    <script src="d3.min.js"></script> 
        <style>
        </style>             
    </head>
    <body>
<div id="asd">
<hr></hr>
</div>
        <script type="text/javascript">
      var data = [{
    "dia": 1,
        "arrancado": 3,
        "parado": 2,
        "trabajo1": 1,
        "trabajo2": 3
}, {
        "dia": 2,
        "critical": 6,
        "arrancado": 3,
        "trabajo1": 2,
        "parado": 5,
        "trabajo2": 3
}, {
    "dia": 3,
        "critical": 2,
        "arrancado": 13,
        "parado": 1,
        "trabajo1": 2,
        "trabajo2": 2
}, {
    "dia": 4,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},
{
    "dia": 5,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 6,
        "arrancado": 0,
        "parado": 0,
        "trabajo1": 0,
        "trabajo2": 0
},{
    "dia": 8,
        "arrancado": 0,
        "parado": 0,
        "trabajo1": 0,
        "trabajo2": 0
},{
    "dia": 8,
        "arrancado": 0,
        "parado": 0,
        "trabajo1": 0,
        "trabajo2": 0
},{
    "dia": 9,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 10,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 11,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 12,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 13,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 14,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 15,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 16,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 17,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 18,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 19,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 20,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 21,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 22,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 23,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 24,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 25,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 26,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 27,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 28,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 29,
        "arrancado": 5,
        "parado": 1,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 30,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 31,
        "arrancado": 1,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
}];

var margin = {
    top: 0,
    right: 0,
    bottom: 0,
    left: 0
},
width = 8*31 - margin.left - margin.right,
    height = 100 - margin.top - margin.bottom;

var x = d3.scale.ordinal()
    .rangeRoundBands([0, width], .1);

var y = d3.scale.linear()
    .rangeRound([height, 0]);

 var color = d3.scale.ordinal()
     .range(["green", "gray", "blue"]);


var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom");

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left")
    .tickFormat(d3.format(".2s"));

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

color.domain(d3.keys(data[0]).filter(function (key) {
    return key !== "dia";
}));

data.forEach(function (d) {
    var y0 = 0;
    d.ages = color.domain().map(function (name) {
        return {
            name: name,
            y0: y0,
            y1: y0 += +d[name]
        };
    });
    d.total = d.ages[d.ages.length - 1].y1;
});


x.domain(data.map(function (d) {
    return d.dia;
}));
y.domain([0, 24]);

svg.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + height + ")")
    .call(xAxis);


var dia = svg.selectAll(".dia")
    .data(data)
    .enter().append("g")
    .attr("class", "g")
    .attr("transform", function (d) {
    return "translate(" + x(d.dia) + ",0)";
});

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



        </script>

    </body>
</html>

我试图从 google 中的例子中实现,但我都失败了。

这个例子对我有用。

  1. 包括工具提示库
  2. 添加了 d3.tip() 方法和 svg.call(提示)
  3. 包括工具提示 css
  4. 添加了 mouseover 和 mouseout 侦听器以纠正 show/hide 示例中提到的提示。

body {
  font: 10px sans-serif;
}

.axis path,
.axis line {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;
}

.bar {
  fill: orange;
}

.bar:hover {
  fill: orangered ;
}

.x.axis path {
  display: none;
}

.d3-tip {
  line-height: 1;
  font-weight: bold;
  padding: 12px;
  background: rgba(0, 0, 0, 0.8);
  color: #fff;
  border-radius: 2px;
}

/* Creates a small triangle extender for the tooltip */
.d3-tip:after {
  box-sizing: border-box;
  display: inline;
  font-size: 10px;
  width: 100%;
  line-height: 1;
  color: rgba(0, 0, 0, 0.8);
  content: "BC";
  position: absolute;
  text-align: center;
}

/* Style northward tooltips differently */
.d3-tip.n:after {
  margin: -1px 0 0 0;
  top: 100%;
  left: 0;
}
<!DOCTYPE html>
<html>
    <head>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://labratrevenge.com/d3-tip/javascripts/d3.tip.v0.6.3.js"></script>
        <style>
        </style>             
    </head>
    <body>
<div id="asd">
<hr></hr>
</div>
        <script type="text/javascript">
          
var tip = d3.tip()
  .attr('class', 'd3-tip')
  .offset([-10, 0])
  .html(function(d) {
    console.log(d);
    return "<strong>"+ d.name +":</strong> <span style='color:red'>" + (d.y1 - d.y0) + "</span>";
  });          
      var data = [{
    "dia": 1,
        "arrancado": 3,
        "parado": 2,
        "trabajo1": 1,
        "trabajo2": 3
}, {
        "dia": 2,
        "critical": 6,
        "arrancado": 3,
        "trabajo1": 2,
        "parado": 5,
        "trabajo2": 3
}, {
    "dia": 3,
        "critical": 2,
        "arrancado": 13,
        "parado": 1,
        "trabajo1": 2,
        "trabajo2": 2
}, {
    "dia": 4,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},
{
    "dia": 5,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 6,
        "arrancado": 0,
        "parado": 0,
        "trabajo1": 0,
        "trabajo2": 0
},{
    "dia": 8,
        "arrancado": 0,
        "parado": 0,
        "trabajo1": 0,
        "trabajo2": 0
},{
    "dia": 8,
        "arrancado": 0,
        "parado": 0,
        "trabajo1": 0,
        "trabajo2": 0
},{
    "dia": 9,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 10,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 11,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 12,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 13,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 14,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 15,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 16,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 17,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 18,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 19,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 20,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 21,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 22,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 23,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 24,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 25,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 26,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 27,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 28,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 29,
        "arrancado": 5,
        "parado": 1,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 30,
        "arrancado": 8,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
},{
    "dia": 31,
        "arrancado": 1,
        "parado": 3,
        "trabajo1": 3,
        "trabajo2": 2
}];

var margin = {
    top: 0,
    right: 0,
    bottom: 0,
    left: 0
},
width = 8*31 - margin.left - margin.right,
    height = 100 - margin.top - margin.bottom;

var x = d3.scale.ordinal()
    .rangeRoundBands([0, width], .1);

var y = d3.scale.linear()
    .rangeRound([height, 0]);

 var color = d3.scale.ordinal()
     .range(["green", "gray", "blue"]);


var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom");

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left")
    .tickFormat(d3.format(".2s"));

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
          
svg.call(tip);
          
color.domain(d3.keys(data[0]).filter(function (key) {
    return key !== "dia";
}));

data.forEach(function (d) {
    var y0 = 0;
    d.ages = color.domain().map(function (name) {
        return {
            name: name,
            y0: y0,
            y1: y0 += +d[name]
        };
    });
    d.total = d.ages[d.ages.length - 1].y1;
});


x.domain(data.map(function (d) {
    return d.dia;
}));
y.domain([0, 24]);

svg.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + height + ")")
    .call(xAxis);


var dia = svg.selectAll(".dia")
    .data(data)
    .enter().append("g")
    .attr("class", "g")
    .attr("transform", function (d) {
    return "translate(" + x(d.dia) + ",0)";
});

dia.selectAll("rect")
    .data(function (d) {
    return d.ages;
})
    .enter().append("rect")
    .attr("width", x.rangeBand())
    .on('mouseover', tip.show)
    .on('mouseout', tip.hide)
    .attr("y", function (d) {
    return y(d.y1);
})
    .attr("height", function (d) {
    return y(d.y0) - y(d.y1);
})
    .style("fill", function (d) {
    return color(d.name);
});



        </script>

    </body>
</html>

试试这个方法。

1) 创建一个工具提示 div 并将其设置为默认隐藏。

var tooltip = d3.select("body")
  .append("div")
  .style("position", "absolute")
  .style("z-index", "10")
  .style("visibility", "hidden")
  .text("a simple tooltip");

2) 在鼠标悬停时更新内容并显示工具提示 div。

 dia.on("mouseover", function(d, i) {
        var notNeeded = ["dia", "total", "ages"];

        var keys = Object.keys(d);
        keys = keys.filter(function(s) {
          return notNeeded.indexOf(s) == -1
        });

        tooltip.html(keys.map(function(k) {
          return k + ":" + d[k]
        }).join("<br/>"));
        return tooltip.style("visibility", "visible");
      })
      .on("mousemove", function() {
        return tooltip.style("top", (d3.event.pageY - 10) + "px").style("left", (d3.event.pageX + 10) + "px");
      })
      .on("mouseout", function() {
        return tooltip.style("visibility", "hidden");
      });

var data = [{
  "dia": 1,
  "arrancado": 3,
  "parado": 2,
  "trabajo1": 1,
  "trabajo2": 3
}, {
  "dia": 2,
  "critical": 6,
  "arrancado": 3,
  "trabajo1": 2,
  "parado": 5,
  "trabajo2": 3
}, {
  "dia": 3,
  "critical": 2,
  "arrancado": 13,
  "parado": 1,
  "trabajo1": 2,
  "trabajo2": 2
}, {
  "dia": 4,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 5,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 6,
  "arrancado": 0,
  "parado": 0,
  "trabajo1": 0,
  "trabajo2": 0
}, {
  "dia": 8,
  "arrancado": 0,
  "parado": 0,
  "trabajo1": 0,
  "trabajo2": 0
}, {
  "dia": 8,
  "arrancado": 0,
  "parado": 0,
  "trabajo1": 0,
  "trabajo2": 0
}, {
  "dia": 9,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 10,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 11,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 12,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 13,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 14,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 15,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 16,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 17,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 18,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 19,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 20,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 21,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 22,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 23,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 24,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 25,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 26,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 27,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 28,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 29,
  "arrancado": 5,
  "parado": 1,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 30,
  "arrancado": 8,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}, {
  "dia": 31,
  "arrancado": 1,
  "parado": 3,
  "trabajo1": 3,
  "trabajo2": 2
}];

var margin = {
    top: 0,
    right: 0,
    bottom: 20,
    left: 0
  },
  width = 8 * 31 - margin.left - margin.right,
  height = 100 - margin.top - margin.bottom;

var x = d3.scale.ordinal()
  .rangeRoundBands([0, width], .1);

var y = d3.scale.linear()
  .rangeRound([height, 0]);

var color = d3.scale.ordinal()
  .range(["green", "gray", "blue"]);


var xAxis = d3.svg.axis()
  .scale(x)
  .orient("bottom");

var yAxis = d3.svg.axis()
  .scale(y)
  .orient("left")
  .tickFormat(d3.format(".2s"));

var svg = d3.select("body").append("svg")
  .attr("width", width + margin.left + margin.right)
  .attr("height", height + margin.top + margin.bottom)
  .append("g")
  .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var tooltip = d3.select("body")
  .append("div")
  .attr("class", "tooltip")
  .style("position", "absolute")
  .style("z-index", "10")
  .style("visibility", "hidden")
  .text("a simple tooltip");

color.domain(d3.keys(data[0]).filter(function(key) {
  return key !== "dia";
}));

data.forEach(function(d) {
  var y0 = 0;
  d.ages = color.domain().map(function(name) {
    return {
      name: name,
      y0: y0,
      y1: y0 += +d[name]
    };
  });
  d.total = d.ages[d.ages.length - 1].y1;
});


x.domain(data.map(function(d) {
  return d.dia;
}));
y.domain([0, 24]);

svg.append("g")
  .attr("class", "x axis")
  .attr("transform", "translate(0," + height + ")")
  .call(xAxis);


var dia = svg.selectAll(".dia")
  .data(data)
  .enter().append("g")
  .attr("class", "g")
  .attr("transform", function(d) {
    return "translate(" + x(d.dia) + ",0)";
  });

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

dia.on("mouseover", function(d, i) {
    var notNeeded = ["dia", "total", "ages"];

    var keys = Object.keys(d);
    keys = keys.filter(function(s) {
      return notNeeded.indexOf(s) == -1
    });

    tooltip.html(keys.map(function(k) {
      return "<b>" + k + "</b> : " + d[k]
    }).join("<br/>"));
    return tooltip.style("visibility", "visible");
  })
  .on("mousemove", function() {
    return tooltip.style("top", (d3.event.pageY - 10) + "px").style("left", (d3.event.pageX + 10) + "px");
  })
  .on("mouseout", function() {
    return tooltip.style("visibility", "hidden");
  });
.tooltip {
  background-color: grey;
  color: black;
  border-radius: 2px;
  padding: 2px;
}
g.tick text {
    font-size: 8px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>