D3.js将数组数据映射从规范化更改为规则堆叠图
d3.js change array data mapping from normalized to regular stacked chart
我可以创建一个规范化的堆叠条形图和一个常规的堆叠条形图。我希望能够根据用户的选择在两者之间进行转换。
我创建了一个函数,用下面的代码将我的数据映射到正态分布:
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"永久地更改为矩形坐标数组,这是伟大的…除非我想展示一个非标准化的堆叠条形图。如果我试图传递到下面的函数,我将得到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
}));
}
我相信有一个更优雅的方法来解决这个问题。欢迎任何建议。 我明白了。我只是在数据中添加了更多的元素。Map函数,使数组现在具有yp(百分比/规范化)和y(常规堆栈)值。(咄!)我很可能会把x/y的比例移出函数。这是一个很大的帮助:http://bl.ocks.org/tmaybe/6144082
function dataMap(data) {
/*
http://jsfiddle.net/dB96T/4/
create rectangle dimensions for stacked bar chart
yp = y percentage/normalized
y = regular stack
*/
data = data.map(function (d, i) {
console.log("length:" + d.length);
var j,
columnTotal = 0,
yp0 = 0,
y0 = 0;
// Count total of each stack
for (j = 0; j < d.length; j++) {
columnTotal += d[j].value;
}
for (j = 0; j < d.length; j++) {
var y = d[j].value;
var yp = d[j].value / columnTotal;
d[j] = {x: i, yp: yp, yp0: yp0, y:y, y0:y0};
yp0 += yp;
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
}));
}
相关文章:
- 用Javascript修改内部标记的CSS规则
- 如何禁用和启用css规则
- 在验证器中添加自定义规则以检查<ul>具有元素
- 如何在JavaScript中创建打字机效果,这将考虑html标记规则
- Magento目录价格折扣规则不适用于产品详细信息页面
- 我有多个复选框,并希望为其中 2 个制定规则,以便如果我选择 1 个,则无法选择另一个
- 如何在提交表单时忽略ajax中的验证规则和消息
- 使用jQueryValidate规则标记必填字段
- Jquery.pwsstrength密码强度指示器规则不起作用
- 使用javascript或jquery覆盖css规则
- JS RegEx for date&名称规则
- .validate规则:检查jquery变量
- 如何在浏览器中执行对比度拉伸/规范化
- 我可以让浏览器忽略(CORS)规则吗
- 节点计划不适用于特定日期发送规则
- 将动态验证文本添加到自定义jQuery验证规则中
- 在蛋糕中动态添加验证规则PHP 2.*
- Rally App SDK 2.0:Ext.Element 方法“不可选择”并没有那么规范化
- 新的javascript HTML元素不遵循css规则
- D3.js将数组数据映射从规范化更改为规则堆叠图