解决:jsfiddle
问题#1:有一个分组的条形图。我希望小组能够突出显示小组中的任何小节是否已经过了。
目前在鼠标悬停时将所有具有“bar”类的rects设置为不透明度0.5,然后将特定矩形设置为不透明度1.但是,如何将节点或条组设置为不透明度1,以便它们突出显示为其他?
.on("mouseover", function(d, i, node) { //this is repeated should be in a function
d3.selectAll(".bar").transition()
.style("opacity", 0.3); //all groups given opacity 0
d3.select(this).transition()
.style("opacity", 1); //give opacity 1 to group on which it hovers.
return tooltip
.style("visibility", "visible")
.html("<span style=font-size:30px;> " + "name:" + d.name +
"</span>"
)
})
.on("mouseout", function(d) {
d3.selectAll(".bar").transition()
.style("opacity", 1);
return tooltip.style("visibility", "hidden");
})
问题#2:我还希望条形的x轴标签表现相似。因此,除了当前条形图之外的所有名称都将具有不透明度0.5
我确实尝试在xAxis文本中添加bar的clas,但不起作用,
.call(xAxis)
.selectAll("text")
.style("text-anchor", "end")
.style("font", "20px times")
.attr("dx", "-.8em")
.attr("dy", ".15em")
.attr("class", "bar")
.attr("transform", "rotate(-65)");
我尝试从这篇文章中实现想法
D3 Grouped Bar Chart - Selecting entire group?
但我无法让它发挥作用。
我尝试为组中的每个条提供一个d.name +索引类。但我不能选择那么回归“。” + d.name无法正常工作。
.attr("class", function(d, i) {
return d.name.replace(/\s/g, '') + i + " bar"
})
.on("mouseover", function(d, i, node) {
d3.selectAll(".bar").transition()
.style("opacity", 0.3);
d3.selectAll("." + d.name.replace(/\s/g) + i)
.transition()
.style("opacity", 1);
return tooltip
.style("visibility", "visible")
.html("<span style=font-size:30px;> " + "name:" + d.name +
"</span>");
})
选择应该是,
d3.selectAll("." + d.name.replace(/\s/g, '') + i)
实际上每组中的每个栏都可以获得一组“组+索引”。没有必要使用正则表达式。
除了xAxis上的文字外,突出显示现在正常工作。
非常感谢任何帮助,
由于
答案 0 :(得分:2)
您可以根据其.name值(这是您示例中每个组的常用属性)的所有条形图的不透明度,例如
.on("mouseover", function(d) {
let selectedName = d.name;
d3.selectAll(".bar")
.style("opacity", function(d) {
return d.name == selectedName ? 1 : 0.3;
})
//etc
答案 1 :(得分:0)
这有效jsFiddle
.on("mouseover", function(d, i, node) {
d3.selectAll(".bar").transition()
.style("opacity", 0.3);
d3.selectAll(".xAxisText").transition()
.style("fill", "lightgray")
.style("font-weight", "100"); //all groups given opacity 0
d3.selectAll(".groupText" + i)
.transition()
.style("font-weight", "900")
.style("fill", "black"); //give opacity 1 to group on which it hovers.
d3.selectAll(".group" + i)
.transition()
.style("opacity", 1);
return tooltip
.style("visibility", "visible")
.html("<span style=font-size:30px;> " + "name: " + d.name +
" (on blue bar)</span>");
})
.on("mouseout", function(d) {
d3.selectAll(".bar").transition()
.style("opacity", 1);
d3.selectAll(".xAxisText").transition()
.style("fill", "black")
.style("font-weight", "normal");
return tooltip.style("visibility", "hidden");
})