【发布时间】:2015-08-08 07:40:58
【问题描述】:
我能够创建标准化堆积条形图和常规堆积条形图。我希望能够根据用户的选择在两者之间进行转换。
我创建了一个函数,使用以下代码将我的数据映射到正态分布:
function dataMapNormalize(data) {
/*
http://jsfiddle.net/dB96T/4/
manually create data points for stacked bar chart with y0 values
*/
data = data.map(function (d, i) {
console.log("length:" + d.length);
var j,
columnTotal = 0,
y0 = 0;
for (j = 0; j < d.length; j++) {
columnTotal += d[j].value;
}
for (j = 0; j < d.length; j++) {
var y = d[j].value / columnTotal;
d[j] = {x: i, y: y, y0: y0};
y0 += y;
}
return d;
});
console.log(JSON.stringify(data));
y = d3.scale.linear()
.domain([0, 1])
.range([height, 0]);
x = d3.scale.ordinal()
.rangeRoundBands([100, width], .05)
.domain(data.map(function (d) {
return d[0].x
}));
}
dataMapNormalize(ond);
此函数将我的数组“ond”永久更改为矩形坐标数组,这很棒……除非我想显示非标准化堆积条形图。如果我尝试将 ond 传递给下面的函数,我会得到 NAN。
function dataMapStack(data) {
var stackTotals = new Array();
data = data.map(function (d, i) {
var j,
columnTotal = 0,
y0 = 0;
for (j = 0; j < d.length; j++) {
columnTotal += d[j].value;
}
stackTotals.push(columnTotal);
for (j = 0; j < d.length; j++) {
var y = d[j].value;
d[j] = {x: i, y: y, y0: y0};
y0 += y;
}
return d;
});
y = d3.scale.linear()
.domain([0, d3.max(stackTotals)])
.range([height, 0]);
x = d3.scale.ordinal()
.rangeRoundBands([100, width], .05)
.domain(data.map(function (d) {
return d[0].x
}));
}
我确信有一种更优雅的方法可以解决这个问题。打开任何建议。
【问题讨论】:
标签: javascript d3.js