如何向条形图添加多个工具提示
How to add multiple tool tips to a bar chart
我一直在使用带有内置工具提示的 D3 svg 图表(我相信使用 d3-tip 库)。原始代码可以在这里看到:http://bl.ocks.org/Caged/6476579
我已经成功定制了大部分内容,但我需要添加第二个鼠标悬停效果;因此,当您将鼠标悬停在条形图上时,它不仅会打开工具提示,还会打开图表右上角的另一个提示或图层。
我尝试了类似下面的操作,但它似乎不起作用。我只是在语法中遗漏了什么吗?还是这个策略根本行不通?
var tip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function(d) {
return "<strong>Frequency2:</strong> <span style='color:red'>" + d.frequency2 + "</span>";
})
//adding second tool tip
var tip2 = d3.tip()
.attr('class', 'd3-tip')
.offset([-40, 0])
.html(function(d) {
return "<strong>Other Variables:</strong> <span style='color:red'>" + d.frequency2 + "</span>";
})
然后
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.letter); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.frequency2); })
.attr("height", function(d) { return height - y(d.frequency2); })
.on('mouseover', tip.show, tip2.show)
.on('mouseout', tip.hide, tip2.hide);
图表仍然有效,但现在工具提示均未显示。
你现在在做什么...
.on('mouseover', tip.show, tip2.show)
...将不起作用。在 selection.on
中,第三个参数是 capture:
selection.on(typenames[, listener[, capture]])
因此,解决方案是将 tip
和 tip2
包装在另一个函数中:
.on("mouseover", function() {
tip.show();
tip2.show();
})
这是一个演示(将鼠标悬停在圆圈上):
var svg = d3.select("svg");
var tip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 20])
.html("<strong>Frequency2:</strong> <span style='color:red'>foo</span>")
var tip2 = d3.tip()
.attr('class', 'd3-tip')
.offset([90, 20])
.html("<strong>Other Variables:</strong> <span style='color:red'>bar</span>")
svg.call(tip)
svg.call(tip2)
d3.select("circle").on("mouseover", function() {
tip.show();
tip2.show();
}).on("mouseout", function() {
tip.hide();
tip2.hide();
});
.d3-tip {
line-height: 1;
font-weight: bold;
padding: 12px;
background: rgba(0, 0, 0, 0.8);
color: #fff;
border-radius: 2px;
}
<script src="https://d3js.org/d3.v3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-tip/0.7.1/d3-tip.min.js"></script>
<svg>
<circle cx="50" cy="70" r="20" fill="teal"></circle>
</svg>
我一直在使用带有内置工具提示的 D3 svg 图表(我相信使用 d3-tip 库)。原始代码可以在这里看到:http://bl.ocks.org/Caged/6476579
我已经成功定制了大部分内容,但我需要添加第二个鼠标悬停效果;因此,当您将鼠标悬停在条形图上时,它不仅会打开工具提示,还会打开图表右上角的另一个提示或图层。
我尝试了类似下面的操作,但它似乎不起作用。我只是在语法中遗漏了什么吗?还是这个策略根本行不通?
var tip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function(d) {
return "<strong>Frequency2:</strong> <span style='color:red'>" + d.frequency2 + "</span>";
})
//adding second tool tip
var tip2 = d3.tip()
.attr('class', 'd3-tip')
.offset([-40, 0])
.html(function(d) {
return "<strong>Other Variables:</strong> <span style='color:red'>" + d.frequency2 + "</span>";
})
然后
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.letter); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.frequency2); })
.attr("height", function(d) { return height - y(d.frequency2); })
.on('mouseover', tip.show, tip2.show)
.on('mouseout', tip.hide, tip2.hide);
图表仍然有效,但现在工具提示均未显示。
你现在在做什么...
.on('mouseover', tip.show, tip2.show)
...将不起作用。在 selection.on
中,第三个参数是 capture:
selection.on(typenames[, listener[, capture]])
因此,解决方案是将 tip
和 tip2
包装在另一个函数中:
.on("mouseover", function() {
tip.show();
tip2.show();
})
这是一个演示(将鼠标悬停在圆圈上):
var svg = d3.select("svg");
var tip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 20])
.html("<strong>Frequency2:</strong> <span style='color:red'>foo</span>")
var tip2 = d3.tip()
.attr('class', 'd3-tip')
.offset([90, 20])
.html("<strong>Other Variables:</strong> <span style='color:red'>bar</span>")
svg.call(tip)
svg.call(tip2)
d3.select("circle").on("mouseover", function() {
tip.show();
tip2.show();
}).on("mouseout", function() {
tip.hide();
tip2.hide();
});
.d3-tip {
line-height: 1;
font-weight: bold;
padding: 12px;
background: rgba(0, 0, 0, 0.8);
color: #fff;
border-radius: 2px;
}
<script src="https://d3js.org/d3.v3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-tip/0.7.1/d3-tip.min.js"></script>
<svg>
<circle cx="50" cy="70" r="20" fill="teal"></circle>
</svg>