- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 d3.stack()
创建一个规范化堆叠条形图。
但是我无法访问鼠标悬停工具提示的初始数据集的相关值。
serie.selectAll("rect")
.data(function(d) { return d; })
.enter().append("rect")
...
.on("mousemove", function(d){
let coords = d3.mouse(svg.node());
tooltip.style("left", coords[0] + "px");
tooltip.style("top", coords[1] - 70 + "px");
tooltip.style("display", "inline-block");
tooltip.html("HOW TO ACCESS DATA HERE?");
});
d
是此时的Array[2]
,其值定义了baseline/topline,d.data
是完整的原始数据对象,但缺少我当前正在徘徊的系列堆栈的信息。
理想情况下,我希望工具提示显示像 {name:"item1", foo:10, bar:20}
value: 10
percentage: 33%
当悬停在 foo
矩形上方时。
我发现的所有示例都是针对 D3v3 的,您可以在其中简单地使用 d.y
来访问相关值,但这似乎不再适用于 D3v4。
最佳答案
您可以获得访问父级数据的元素的名称,并使用该名称获取值:
.on('mouseover', function(d, i) {
var thisName = d3.select(this.parentNode).datum().key;
var thisValue = d.data[thisName];
var total = d.data.foo + d.data.bar;
tooltip.html("Name: " + thisName + "<br>Value: " + thisValue + "<br>Percentage: " + thisValue / total + "%");
});
这是修改后的代码:
var svg = d3.select("svg"),
margin = {
top: 20,
right: 60,
bottom: 30,
left: 40
},
width = +svg.attr("width") - margin.left - margin.right,
height = +svg.attr("height") - margin.top - margin.bottom,
g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var x = d3.scaleBand()
.rangeRound([0, width])
.padding(0.1)
.align(0.1);
var y = d3.scaleLinear()
.rangeRound([height, 0]);
var stack = d3.stack()
.offset(d3.stackOffsetExpand);
var colors = ["#FF0000", "#00FF00", "#0000FF"];
var data = [{
name: "item1",
foo: 10,
bar: 20
}, {
name: "item2",
foo: 50,
bar: 50
}];
x.domain(data.map(function(d) {
return d.name;
}));
var serie = g.selectAll(".serie")
.data(stack.keys(["foo", "bar"])(data))
.enter().append("g")
.attr("class", "serie")
.attr("fill", function(d, i) {
return colors[i];
});
var tooltip = d3.select('#tooltip');
var rects = serie.selectAll("rect")
.data(function(d) {
return d;
})
.enter().append("rect")
rects.attr("x", function(d) {
return x(d.data.name);
})
.attr("y", function(d) {
return y(d[1]);
})
.attr("height", function(d) {
return y(d[0]) - y(d[1]);
})
.attr("width", x.bandwidth())
.on('mouseover', function(d, i) {
var thisName = d3.select(this.parentNode).datum().key;
var thisValue = d.data[thisName];
var total = d.data.foo + d.data.bar;
tooltip.html("Name: " + thisName + "<br>Value: " + thisValue + "<br>Percentage: " + thisValue / total + "%");
});
g.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
g.append("g")
.attr("class", "axis axis--y")
.call(d3.axisLeft(y).ticks(10, "%"));
<script src="https://d3js.org/d3.v4.min.js"></script>
<div id="tooltip">tooltip</div>
<svg width="500" height="300"></svg>
关于javascript - D3v4 堆积条形图工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42173318/
我使用 Dojo fadeIn 和 fadeOut 以及一个计时器旋转了三个堆叠图像。只有最后一个的 href 可用。是否也可以旋转 href? 这是它的 CSS: #main-slides
给定一个 numpy 数组,我想总结统一的元素 block 以形成一个新的、更小的数组。它与分箱类似,但不是按频率分箱。除了通过示例(如下)之外,我不确定如何描述它。 问题:是否有用于此的函数或更清晰
我正在尝试实现某种按钮控制的幻灯片放映,其中包括用于页面顶部全 Angular 图片的 div,用于页面顶部的 div页面底部的另一张全 Angular 图片和中央内容的最终 div(包括控制“幻
嘿,我正在使用 D3JS 作为图表库,我真的很想利用气泡图中的超酷功能。上主D3JS chart站点下面的Bubble Chart用来比较两组数据: Bubble Chart . 我想知道是否有人真的
我是一名优秀的程序员,十分优秀!