我正在使用d3制作堆积条形图。
数据是一个数组,每个条形图都有一个对象(例如“喜欢”)。然后每个对象包含一个值数组,每个条形驱动单个矩形:
data = [{
key = 'likes', values = [
{key = 'blue-frog', value = 1},
{key = 'goodbye', value = 2}
]
}, {
key = 'dislikes, values = [
{key = 'blue-frog', value = 3},
{key = 'goodbye', value = 4}
]
}]
图表工作正常,如下:
// Create canvas
bars = svg.append("g");
// Create individual bars, and append data
// 'likes' are bound to first bar, 'dislikes' to second
bar = bars.selectAll(".bar")
.data(data)
.enter()
.append("g");
// Create rectangles per bar, and append data
// 'blue-frog' is bound to first rectangle, etc.
rect = bar.selectAll("rect")
.data(function(d) { return d.values;})
.enter()
.append("rect");
我想为每个矩形创建工具提示,其中包含“喜欢:2”之类的内容。这涉及将有关条形键的信息绑定到矩形。我还没有找到一种方法(除了更改数据)。你能看到一个优雅的解决方案吗?
另外,我不确定我是否以最佳方式描述了这个问题。如果您对更好的标题有任何建议,请告诉我。
答案 0 :(得分:12)
不确定您是否认为这是一个优雅的解决方案,但它可以避免更改您的数据。
它借鉴了一些关键的“功能”:
因此,在您的示例中,您可以获得选择数组:
var selection = bar.selectAll("rect")
.data(function(d) { return d.values;})
.enter();
从选择数组中,您可以获得有问题的数据:
selection
.append("li")
.text(function(d,i,j) {
return selection[j].parentNode.__data__.key;
}
更容易看到完整的示例,而不是在这种情况下的代码片段:
正如我在要点上提到的那样 - 我记得读过这个数据访问器功能的这个3参数形式,但不能为我的生活记住在哪里 - 我很欢迎被指向记录这个'特征的源材料”。
答案 1 :(得分:-1)
你看过Tipsy吗?
它可能完全符合您的需要,并为您完成大部分工作。例如,只需添加此文本块:
$('svg circle').tipsy({
gravity: 'w',
html: true,
title: function() {
var d = this.__data__;
var pDate = d.date;
return 'Date: ' + pDate.getDate() + " " + monthNames[pDate.getMonth()] + " " + pDate.getFullYear() + '<br>Value: ' + d.value;
}
});
获取工具提示,其中包含D3示例的所有相应数据:Line Chart with Tipsy Tooltips。