Ich habe eine Reihe von Daten, die eine von sechs Kategorien ist, jedes Stück Daten hat eine Zeit damit verbunden. Ich muss ein Histogramm verwenden, um diese Daten in Monatsbins zu sortieren, was einfach ist, aber ich muss auch jede Kategorie stapeln. Ich habe nach einem Beispiel für gestapelte Histogramme gesucht, aber die einzigen, die ich finden kann, stammen von d3 v3, das sich in seiner Stapel-API offensichtlich sehr unterscheidet. Im Moment stecke ich darin fest, dass ich nach dem Aufruf stack()
unsinnige Daten zurückbekomme, die ich nicht verwenden kann, um ein gestapeltes Balkendiagramm zu erzeugen.d3 v4: Stapel mit Histogrammdaten verwenden?
var data = this.data;
var margin = {top: 20, right: 20, bottom: 30, left: 50},
width = this.width - margin.left - margin.right,
height = this.height - margin.top - margin.bottom;
data.forEach(function(d) {
d.date = d3.isoParse(d.createdDate);
});
// set the ranges
var x = d3.scaleTime()
.domain(d3.extent(data, function(d) { return d.date; }))
.rangeRound([0, width]);
var y = d3.scaleLinear()
.range([height, 0]);
var colours = d3.scaleOrdinal(d3.schemeCategory10);
var svg = d3.select(this.$.chart);
var svg2 = svg.select("#canvas");
var histogram = d3.histogram()
.value(function(d) { return d.date; })
.domain(x.domain())
.thresholds(x.ticks(d3.timeMonth));
var dataGroupedByType = d3.nest()
.key(function(d) {
return d.type;
})
.object(data, d3.map);
var histDataByType = [];
for (var key in dataGroupedByType) {
var histData = histogram(dataGroupedByType[key]);
histDataByType.push({type: key, values: histData});
}
var stack = d3.stack()
.keys(["A","B","C","D","E","F"])
.value(function(d, key) {
return d.values;
});
var stackedHistData = stack(histDataByType);
dataGroupedByType
ist ein Objekt mit sechs keyed Objekten (A bis F), die jeweils ein Array von Datenobjekten enthalten. Dann mache ich histDataByType
was zu einem Array von 6 Objekten führt, von denen jedes eine type
Eigenschaft (A bis F) und ein values
Array hat, was immer die gleiche Länge ist (91 in meinem Fall, da meine Daten 91 Monate umfassen). Innerhalb dieses Arrays befindet sich ein weiteres Array mit bin-Daten (falls vorhanden) und den Werten x0
und x1
. An diesem Punkt wurde das Binning erledigt, alles, was ich brauche, ist alles zu stapeln und die Werte y0
und y1
zu bekommen.
Also, ich rufe stack
, aber es gibt mir Müll raus; stackedHistData
ist ein Array von 6, jedes Array hat eine 0-Eigenschaft, die 0 entspricht, eine 1-Eigenschaft, die 'NaN' entspricht, und eine data
-Eigenschaft, die dieses 91-lange Array, den Index und den Schlüssel (A bis F) hat. Ich sehe nicht einmal die Werte y0
und y1
, die vom Stapelaufruf erzeugt werden sollen. Wie soll es mit dieser Art von Histogrammdaten verwendet werden?