【发布时间】:2014-01-24 04:54:56
【问题描述】:
我有一个多折线图,表示给定日期的 8 个不同系列的值: http://bl.ocks.org/eoiny/8548406
我已经设法过滤掉 series1 并仅为 series1 的每个数据点附加圆圈,使用:
var filtered = city
.filter(function(d){
return d.name == "series1"
})
filtered
.selectAll('circle')
.data(
function(d){return d.values}
)
.enter().append('circle')
.attr({
cx: function(d,i){
return x(d.date)
},
cy: function(d,i){
return y(d.pindex)
},
r: 5
})
但是我试图在我的 series1 行中添加 4 个圆圈,每个圆圈仅用于以下值:
- series1 中的最小值,
- 系列1中的最大值,
- 系列1中的第一个值,
- series1 中的最后一个值。
我通过查看“过滤”数组来解决这个问题,并尝试使用类似这样的方法来捕获最小值和最大值:
.attr("visibility", function(d) {
if (d.pindex == d3.max(filtered, function(d) { return d.pindex; })) {return "visible"}
if (d.pindex == d3.min(filtered, function(d) { return d.pindex; })) {return "visible"}
else { return "hidden" }
;})
但我不知何故被我需要的数据位于过滤数组中的对象中这一事实弄糊涂了。我知道过滤后的应该是这样的:
[{
name: "series1",
values: [{date: "2005-01-01",
pindex: "100"},
{date: "2005-02-01"
pindex: "100.4"}, ...etc for all data points i.e. dates
]
}]
所以我尝试了这样的事情:
d.pindex == d3.max(filtered, function(d) { return d.values.pindex; })
但我还是有点迷茫。有人有什么想法吗?
【问题讨论】:
-
创建一个最小的小提琴总是有帮助的。 d3.max 中的函数应该是
function(d,i) {return d.values[i].pindex;},因为 values 是一个数组吗? -
您也可以使用原始数据本身 (
cities) 而不是 D3 包装的对象。 -
@FernOfTheAndes 我尝试使用:'.attr("visibility", function(d) { if (d.pindex == d3.max(filtered, function(d,i) {return d. values[i].pindex;}))
{return "visible"} else { return "hidden" } ;}) ' -
我收到此消息:未捕获类型错误:无法读取未定义的属性“0”
-
有点切线,但我建议,不要为这些特殊值创建一组全新的圆元素,您只需根据数据更改初始圆本身的类/样式。跨度>
标签: d3.js