鼠标悬停时 d3 分组条形图突出显示组
d3 grouped bar chart highlight group on mouseover
已解决:jsfiddle
问题 #1:有一个分组条形图。如果将鼠标悬停在组中的任何栏上,我希望该组突出显示。
目前在鼠标悬停时将所有 class 'bar' 的矩形设置为不透明度 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 文本中添加一个条形图类,但是没有用,
.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)");
我尝试实现这个 post
中的想法
但我没能让它工作。
我尝试为一组中的每个柱提供 class 的 d.name + 索引。但是我不能 select 然后 return “。” + 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>");
})
select应该是,
d3.selectAll("." + d.name.replace(/\s/g, '') + i)
实际上,每个组中的每个条都可以被赋予 "group + index" 的 class。不需要正则表达式。
除了 xAxis 上的文本,突出显示现在工作正常。
如有任何帮助,我们将不胜感激,
谢谢
您可以将所有条形的不透明度基于其 .name 值(在您的示例中这是每个组的公共属性),例如
.on("mouseover", function(d) {
let selectedName = d.name;
d3.selectAll(".bar")
.style("opacity", function(d) {
return d.name == selectedName ? 1 : 0.3;
})
//etc
这个有效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");
})
已解决:jsfiddle
问题 #1:有一个分组条形图。如果将鼠标悬停在组中的任何栏上,我希望该组突出显示。
目前在鼠标悬停时将所有 class 'bar' 的矩形设置为不透明度 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 文本中添加一个条形图类,但是没有用,
.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)");
我尝试实现这个 post
中的想法但我没能让它工作。
我尝试为一组中的每个柱提供 class 的 d.name + 索引。但是我不能 select 然后 return “。” + 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>");
})
select应该是,
d3.selectAll("." + d.name.replace(/\s/g, '') + i)
实际上,每个组中的每个条都可以被赋予 "group + index" 的 class。不需要正则表达式。
除了 xAxis 上的文本,突出显示现在工作正常。
如有任何帮助,我们将不胜感激,
谢谢
您可以将所有条形的不透明度基于其 .name 值(在您的示例中这是每个组的公共属性),例如
.on("mouseover", function(d) {
let selectedName = d.name;
d3.selectAll(".bar")
.style("opacity", function(d) {
return d.name == selectedName ? 1 : 0.3;
})
//etc
这个有效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");
})