Ich habe folgende Datenanzeige auf einem d3 Diagramm:d3 Snap Bürste Daten ein xAchse
[{
"Date": "2012",
"Total": 5340
}, {
"Date": "2013",
"Total": 4120
}, {
"Date": "2014",
"Total": 1259
}, {
"Date": "2015",
"Total": 3617
}, {
"Date": "2016",
"Total": 2005
}]
Die Grafik hat auch eine Bürste auf sie, damit der Benutzer auf eine Auswahl von Jahren, indem Sie den Pinsel konzentrieren . Mit dem Pinsel kann der Benutzer jedoch zwischen dem ersten und dem letzten Jahr über alle Daten ziehen.
Was ich tun möchte, ist es zu machen, die Jahre zu knipsen, während der Benutzer bürstet. So ist https://bl.ocks.org/mbostock/6232620
die Idee, dass das Jahr abgerundet wird zuerst ab und dann wird das Ausmaß modifiziert, bevor angewendet:
Hier ist mein Code für die Bürsten Ereignisse:
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
}
Diese auf basiert zu den Domains und sollte den Pinsel Snap machen ... aber es schnappt nicht ... stattdessen macht es den Benutzer kämpfen, es zwischen den Jahren zu ziehen. Ich möchte es auf das nächste Jahr, wenn der Benutzer beginnt zu ziehen. Sie sollten sich nie zwischen den Jahren hin- und herziehen können.
Sie wollen es nur jährlich arbeiten, oder Sie wollen es Daten in Daten gerundet werden? – Mehraban
@SaeedAdelMehraban Nur einmal in diesem Beispiel und dann, wenn es richtig einrastet, kann ich es an meine anderen Datumsformate anpassen. Kurz gesagt: Schnapp dir die Jahre. – Cameron
Ich habe meine Antwort auf die Arbeit mit d3 v3 aktualisiert. – Mehraban