使用d3.relayout.stack()堆栈多个度量的DRY方式
DRY way to stack multiple metrics with d3.layout.stack()
我使用d3.js流图来显示一段时间内的销售额。然后,我有一个过渡,显示利润在同一时期。数据如下:
var data = [{
"name": "apples",
"sales": [{
"x": 0,
"y": 941
}, {
"x": 1,
"y": 490
}],
"profit": [{
"x": 0,
"y": 6
}, {
"x": 1,
"y": 3
}]
}, {
"name": "oranges",
"sales": [{
"x": 0,
"y": 344
}, {
"x": 1,
"y": 425
}],
"profit": [{
"x": 0,
"y": 3
}, {
"x": 1,
"y": 2
}]
}];
它是有效的,但我目前正在以一种有点笨拙的方式生成堆叠的数据,两次应用堆叠值:
var stack_sales = d3.layout.stack()
.offset("wiggle")
.values(function(d) { return d.sales; });
var stack_profit = d3.layout.stack()
.offset("wiggle")
.values(function(d) { return d.profit; });
stack_sales(data);
stack_profit(data);
我一直在研究JavaScript模式,但看不到干的方法。你能帮忙吗?
一个选项是动态定义值函数:
var stack = d3.layout.stack().offset("wiggle");
["sales", "profit"].forEach(function(metric) {
stack.values(function(d) { return d[metric]; })(data);
});
另一种选择是转换数据,使指标在外部,系列在内部:
var metrics = [
{
"name": "sales",
"series": [
{
"name": "apples",
"values": [
{"x": 0, "y": 941},
{"x": 1, "y": 490}
]
},
{
"name": "oranges",
"values": [
{"x": 0, "y": 344},
{"x": 1, "y": 425}
]
}
]
}, {
"name": "profits",
"series": [
{
"name": "apples",
"values": [
{"x": 0, "y": 0},
{"x": 1, "y": 6}
]
},
{
"name": "oranges",
"values": [
{"x": 0, "y": 1},
{"x": 1, "y": 3}
]
}
]
}
];
然后您可以静态访问这些值:
var stack = d3.layout.stack()
.offset("wiggle")
.values(function(d) { return d.values; });
metrics.forEach(function(metric) {
stack(metric.series);
});
相关文章:
- 用DRY方式Javascript/JQuery动态替换HTML
- 重构DRY代码的Node.JS回调
- 如何在为表单输入分别处理$(this)和$时编写DRY代码
- 这里有一个更优雅的/DRY/可维护的JS解决方案
- 使用d3.relayout.stack()堆栈多个度量的DRY方式
- 如何在 Javascript 库中协调 DRY 和 Loose Coupling
- 用于 JQuery 动画导航栏的 DRY 解决方案
- JavaScript字体度量
- DRY-如何将这个if语句转换为不那么复杂的语句
- 在谷歌应用程序脚本中应用DRY原理
- Highcharts:如何使用共享一些配置部件的图表进行DRY
- JQuery,DRY.使用ajax点击功能
- 如何使这个JS代码DRY?While循环
- 我怎么能"DRY”;调出我的html和javascript代码
- 如何重构JQuery代码,使其遵循DRY原则
- Angular 2 DRY:简单模板的小语法
- 如何在 JavaScript 中保持以下异步模式 DRY
- 是否建议使用 DRY 意义上的 javascript 生成重复出现的“元素”
- jquery-ui 滑块更改值度量
- 从 Rails 设置 document.domain 的 DRY 方法