在多线图表 d3js 中悬停时获取所有 y 值的更好方法
A better way to get all y values on hover in a multiline chart d3js
在我的 block (更新) 中,我添加了一个 d3.bisector
来获取悬停时的所有 y 值,我现在想知道的是是否有更好的方法来获取所有值,而不必将新文本元素附加到每个值的 focus
变量,然后 select 它们都在 mouseover
函数中。
我认为将 .data(cities)
添加到 focus
变量,然后以某种方式引用 .text(function(d) {return d.values})
中的数据是一个很好的方法。
我走在正确的轨道上还是有更有效的方法?
在解决您的问题之前:您写道...
let keys = data.columns.slice(1, 5); // This works for some reason...
...对于您知道的片段应该是:
let keys = data.columns.slice(1, 4);
//just 3 cities here ------------^
并说"This works for some reason"。解释很简单,你已经有一个带有 class city
:
的元素
g.append("g").attr("class", "city");
因此,当您这样做时:
var city = g.selectAll(".city")
.data(cities);
您正在将第一个数据对象绑定到一个您从未使用过的组。所以,只需更改那些 class 名称,然后执行 slice(1, 4)
,这是正确的。
回到你的问题:
是的,您可以使用输入选择大大简化该代码:
var labels = focus.selectAll(null)
.data(copy)
.enter()
.append("text")
.attr("class", "lineHoverText")
.attr("font-size", 11)
.attr("x", 10)
.attr("dy", function(_, i) {
return 1 + i * 2 + "em"
});
如您所见,我使用的是 copy
,它只是一个包含三个字符串的数组,而不是 cities
,它是一个充满数据的大数组。
然后:
labels.attr("transform", "translate(" + (x(d.date) + 10) + "," + height / 2.5 + ")")
.text(function(e) {
return e + " " + formatMetric(d[e + METRIC])
});
这是您的 bl.ocks 所做的更改:https://bl.ocks.org/anonymous/dc6abcbd29a6496090467fbcf230e760/9ed42bcbc73276b41b7e66abfbc111b1bf09c72a
此外,考虑更改每个标签的 y
位置:它们现在的样子你无法知道每个标签代表哪一行。
在我的 block (更新) 中,我添加了一个 d3.bisector
来获取悬停时的所有 y 值,我现在想知道的是是否有更好的方法来获取所有值,而不必将新文本元素附加到每个值的 focus
变量,然后 select 它们都在 mouseover
函数中。
我认为将 .data(cities)
添加到 focus
变量,然后以某种方式引用 .text(function(d) {return d.values})
中的数据是一个很好的方法。
我走在正确的轨道上还是有更有效的方法?
在解决您的问题之前:您写道...
let keys = data.columns.slice(1, 5); // This works for some reason...
...对于您知道的片段应该是:
let keys = data.columns.slice(1, 4);
//just 3 cities here ------------^
并说"This works for some reason"。解释很简单,你已经有一个带有 class city
:
g.append("g").attr("class", "city");
因此,当您这样做时:
var city = g.selectAll(".city")
.data(cities);
您正在将第一个数据对象绑定到一个您从未使用过的组。所以,只需更改那些 class 名称,然后执行 slice(1, 4)
,这是正确的。
回到你的问题:
是的,您可以使用输入选择大大简化该代码:
var labels = focus.selectAll(null)
.data(copy)
.enter()
.append("text")
.attr("class", "lineHoverText")
.attr("font-size", 11)
.attr("x", 10)
.attr("dy", function(_, i) {
return 1 + i * 2 + "em"
});
如您所见,我使用的是 copy
,它只是一个包含三个字符串的数组,而不是 cities
,它是一个充满数据的大数组。
然后:
labels.attr("transform", "translate(" + (x(d.date) + 10) + "," + height / 2.5 + ")")
.text(function(e) {
return e + " " + formatMetric(d[e + METRIC])
});
这是您的 bl.ocks 所做的更改:https://bl.ocks.org/anonymous/dc6abcbd29a6496090467fbcf230e760/9ed42bcbc73276b41b7e66abfbc111b1bf09c72a
此外,考虑更改每个标签的 y
位置:它们现在的样子你无法知道每个标签代表哪一行。