javascript - 在 d3v4 中将长数据转换为宽数据的更新函数
问题描述
我正在尝试将一些长数据格式的数据转换为 d3 中的宽数据格式。
我在这里找到了一个包含该信息的帖子:http: //jonathansoma.com/tutorials/d3/wide-vs-long-data/ 但是,此功能仅适用于 d3v3,我需要能够在 d3v4 中使用它.
下面是我的 d3v3 代码。
如果我使用 d3v4 运行它,我不会在控制台中收到任何错误,但是在我记录宽数据的地方,它会显示如下:
wide data (7) [undefined, undefined, undefined, undefined, undefined, undefined, undefined]
我不认为 d3.nest 在 v4 中发生了变化。
谁能告诉我我需要改变什么才能在第 4 版中进行这项工作?非常感谢任何见解!
如果有帮助,这是一个小提琴:https ://jsfiddle.net/ksc4b6wL/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://d3js.org/d3.v3.min.js"></script>
</head>
<body>
<script>
var long_data = [
{date: "01/02/20", value: "3628", age_group: "1 to 18"},
{date: "01/15/20", value: "3634", age_group: "1 to 18"},
{date: "02/03/20", value: "3619", age_group: "1 to 18"},
{date: "02/18/20", value: "3593", age_group: "1 to 18"},
{date: "03/02/20", value: "3605", age_group: "1 to 18"},
{date: "03/16/20", value: "3444", age_group: "1 to 18"},
{date: "04/01/20", value: "3007", age_group: "1 to 18"},
{date: "01/02/20", value: "5753", age_group: "19 to 30"},
{date: "01/15/20", value: "5817", age_group: "19 to 30"},
{date: "02/03/20", value: "5850", age_group: "19 to 30"},
{date: "02/18/20", value: "5826", age_group: "19 to 30"},
{date: "03/02/20", value: "5881", age_group: "19 to 30"},
{date: "03/16/20", value: "5685", age_group: "19 to 30"},
{date: "04/01/20", value: "4876", age_group: "19 to 30"},
{date: "01/02/20", value: "2347", age_group: "31 to 45"},
{date: "01/15/20", value: "2356", age_group: "31 to 45"},
{date: "02/03/20", value: "2394", age_group: "31 to 45"},
{date: "02/18/20", value: "2427", age_group: "31 to 45"},
{date: "03/02/20", value: "2418", age_group: "31 to 45"},
{date: "03/16/20", value: "2371", age_group: "31 to 45"},
{date: "04/01/20", value: "1993", age_group: "31 to 45"},
{date: "01/02/20", value: "1691", age_group: "46 to 70"},
{date: "01/15/20", value: "1727", age_group: "46 to 70"},
{date: "02/03/20", value: "1721", age_group: "46 to 70"},
{date: "02/18/20", value: "1736", age_group: "46 to 70"},
{date: "03/02/20", value: "1726", age_group: "46 to 70"},
{date: "03/16/20", value: "1707", age_group: "46 to 70"},
{date: "04/01/20", value: "1498", age_group: "46 to 70"},
{date: "01/02/20", value: "3372", age_group: "70 and above"},
{date: "01/15/20", value: "3368", age_group: "70 and above"},
{date: "02/03/20", value: "3359", age_group: "70 and above"},
{date: "02/18/20", value: "3407", age_group: "70 and above"},
{date: "03/02/20", value: "3354", age_group: "70 and above"},
{date: "03/16/20", value: "3252", age_group: "70 and above"},
{date: "04/01/20", value: "2777", age_group: "70 and above"}
]
console.log('long data',long_data)
var wide = d3.nest()
.key(function(d) { return d["date"] })
.rollup(function(d) {
return d.reduce(function(prev, curr) {
prev["date"] = curr["date"];
prev[curr["age_group"]] = curr["value"];
return prev;
}, {});
})
.entries(long_data)
.map(function(d) {
return d.values;
});
console.log('wide data',wide)
</script>
</body>
</html>
解决方案
嗯,这很容易。我只需要改变:
.map(function(d) {
return d.values;
});
至:
.map(function(d) {
return d.value;
});
下面的代码有效。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://d3js.org/d3.v4.min.js"></script>
</head>
<body>
<script>
var long_data = [
{date: "01/02/20", value: "3628", age_group: "1 to 18"},
{date: "01/15/20", value: "3634", age_group: "1 to 18"},
{date: "02/03/20", value: "3619", age_group: "1 to 18"},
{date: "02/18/20", value: "3593", age_group: "1 to 18"},
{date: "03/02/20", value: "3605", age_group: "1 to 18"},
{date: "03/16/20", value: "3444", age_group: "1 to 18"},
{date: "04/01/20", value: "3007", age_group: "1 to 18"},
{date: "01/02/20", value: "5753", age_group: "19 to 30"},
{date: "01/15/20", value: "5817", age_group: "19 to 30"},
{date: "02/03/20", value: "5850", age_group: "19 to 30"},
{date: "02/18/20", value: "5826", age_group: "19 to 30"},
{date: "03/02/20", value: "5881", age_group: "19 to 30"},
{date: "03/16/20", value: "5685", age_group: "19 to 30"},
{date: "04/01/20", value: "4876", age_group: "19 to 30"},
{date: "01/02/20", value: "2347", age_group: "31 to 45"},
{date: "01/15/20", value: "2356", age_group: "31 to 45"},
{date: "02/03/20", value: "2394", age_group: "31 to 45"},
{date: "02/18/20", value: "2427", age_group: "31 to 45"},
{date: "03/02/20", value: "2418", age_group: "31 to 45"},
{date: "03/16/20", value: "2371", age_group: "31 to 45"},
{date: "04/01/20", value: "1993", age_group: "31 to 45"},
{date: "01/02/20", value: "1691", age_group: "46 to 70"},
{date: "01/15/20", value: "1727", age_group: "46 to 70"},
{date: "02/03/20", value: "1721", age_group: "46 to 70"},
{date: "02/18/20", value: "1736", age_group: "46 to 70"},
{date: "03/02/20", value: "1726", age_group: "46 to 70"},
{date: "03/16/20", value: "1707", age_group: "46 to 70"},
{date: "04/01/20", value: "1498", age_group: "46 to 70"},
{date: "01/02/20", value: "3372", age_group: "70 and above"},
{date: "01/15/20", value: "3368", age_group: "70 and above"},
{date: "02/03/20", value: "3359", age_group: "70 and above"},
{date: "02/18/20", value: "3407", age_group: "70 and above"},
{date: "03/02/20", value: "3354", age_group: "70 and above"},
{date: "03/16/20", value: "3252", age_group: "70 and above"},
{date: "04/01/20", value: "2777", age_group: "70 and above"}
]
console.log('long data',long_data)
var wide = d3.nest()
.key(function(d) { return d["date"] })
.rollup(function(d) {
return d.reduce(function(prev, curr) {
prev["date"] = curr["date"];
prev[curr["age_group"]] = curr["value"];
return prev;
}, {});
})
.entries(long_data)
.map(function(d) {
return d.value;
});
console.log('wide data',wide)
</script>
</body>
</html>
推荐阅读
- python - mosquitto 代理在接收 MQTT 连接数据包时出错(python)
- python - 有没有更有效的方法来更新 tkinter 上的标签?
- django - 由于我的 html 模板,django is_valid() 返回 false 且没有错误
- c# - 为什么这个带有反射语句的 linq 会击败我编译的表达式树?
- python - Python顶层for循环只运行一次而不是遍历列表
- voiceover - 如何点击链接在mac画外音中听到它?
- python - 有没有办法让 Numba 不要尝试编译函数的特定行?
- r - Rstudio- 删除依赖 rJava 和 xlsx
- asp.net-core - ASP.NET 核心 3.1:将类库添加到 Project_MissingMethodException:找不到方法:'Boolean Microsoft.EntityFrameworkCore.Migrations
- python - 用另一列内的列名重塑数据框