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 中的例子中实现,但我都失败了。
这个例子对我有用。
- 包括工具提示库
- 添加了 d3.tip() 方法和 svg.call(提示)
- 包括工具提示 css
- 添加了 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>
我需要帮助来显示包含栏中所有值的工具提示,例如: 编排: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 中的例子中实现,但我都失败了。
这个例子对我有用。
- 包括工具提示库
- 添加了 d3.tip() 方法和 svg.call(提示)
- 包括工具提示 css
- 添加了 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>