我有D3圖表上的以下數據顯示:D3卡扣刷到日期上XAXIS
[{
"Date": "2012",
"Total": 5340
}, {
"Date": "2013",
"Total": 4120
}, {
"Date": "2014",
"Total": 1259
}, {
"Date": "2015",
"Total": 3617
}, {
"Date": "2016",
"Total": 2005
}]
該圖表還具有在其上的刷子,以便用戶可以通過拖動刷集中於一個選擇的年。然而,畫筆允許用戶在第一年和最後一年之間拖動所有日期。
我想要做的就是在用戶刷牙的時候使其捕捉多年。
這裏是我刷的事件代碼:
var brush = d3.svg.brush()
.x(xScale2)
.on('brush', brushed);
function brushed() {
var min = d3.min(data.map(function (d) {
return d.total;
}));
var max = d3.max(data.map(function (d) {
return d.total;
}));
var extent = brush.extent();
if (!brush.empty()) {
// Snap to years
var newBrush = extent.map(d3.time.year.round);
if (newBrush[0] >= newBrush[1]) {// If empty when rounded, use floor & ceil instead.
newBrush[0] = d3.time.year.floor(extent[0]);
newBrush[1] = d3.time.year.ceil(extent[1]);
}
// update the extent
brush.extent([newBrush[0], newBrush[1]]);
extent = brush.extent();
xScale.domain(brush.empty() ? xScale2.domain() : extent);
yScale.domain([
d3.min(data.map(function (d) {
return (d.date >= extent[0] && d.date <= extent[1]) ? d.total : max;
})),
d3.max(data.map(function (d) {
return (d.date >= extent[0] && d.date <= extent[1]) ? d.total : min;
}))
]);
xScale.domain(brush.empty() ? xScale2.domain() : extent);
yScale.domain([
d3.min(data.map(function (d) {
return (d.date >= extent[0] && d.date <= extent[1]) ? d.total : max;
})),
d3.max(data.map(function (d) {
return (d.date >= extent[0] && d.date <= extent[1]) ? d.total : min;
}))
]);
}
totalChart.attr('d', totalLine); // update line
focus.select('.x.axis').call(xAxis); // update xAxis
focus.select('.y.axis').call(yAxis); // update yAxis
}
這是基於:https://bl.ocks.org/mbostock/6232620
這樣的想法是,今年是第一四捨五入,然後程度正被應用之前修改到域,應該使刷簡單...但是它不會捕捉...相反,它使用戶鬥爭之間拖動它的年間。我希望它實際上在用戶開始拖動時捕捉到下一年。他們永遠不應該能夠在這些年間拖延。
你只是希望它的年度工作或你希望它四捨五入到當前數據的日期? – Mehraban
@SaeedAdelMehraban只需每年在這個例子中,然後一旦它正確捕捉,我可以適應它爲我的其他日期格式工作。所以一言以蔽之。 – Cameron
我已經更新了我的答案,以使用d3 v3。 – Mehraban