总计noob到D3.js并致力于创建我的第一个分组条形图。但是我无法在线使用我的数据。我试图在这里使用这个例子,我的数据已经嵌套了JSON与D3。
我的问题是我无法使用d3.keys方法来检索密钥,因为我的密钥不是州名。它们只是Key
。
更不用说下半场forEach
不会工作,因为键不是州名,它们只是术语key
。因此+d[name]
会在d[MAPLE]
的密钥中真正获得d.values[(Get the Value where the key = name)]
时尝试var ageNames = d3.keys(data[0]).filter(function(key) { return key !== "State"; });
data.forEach(function(d) {
d.ages = ageNames.map(function(name) { return {name: name, value: +d[name]}; });
});
。一旦数据嵌套在JSON
如何获取所有可能的键值,然后使用下一级键和值映射键?使用类似的示例,但使用我的JSON嵌套数据。
{
"key": "1/10/2014",
"values": [
{
"key": "Texas",
"values": 200
},
{
"key": "Colorado",
"values": 300
},
{
"key": "Utah",
"values": 227
}
]
},{
"key": "2/10/2014",
"values": [
{
"key": "Texas",
"values": 225
},
{
"key": "Colorado",
"values": 241
},
{
"key": "Utah",
"values": 500
}
]
}
我的数据是这样的
button.onclick = exampleFunk;
答案 0 :(得分:1)
从问题中不清楚目标是按州(" Texas"," Colorado" ...)或日期("沿x轴的1/10/2014"," 2/10 / 2014" ...)。
假设日期(因为那是当前数据的结构),这里有一个正常工作:http://plnkr.co/edit/C8lkPMGanFY9BkTc6f1i?p=preview
将数据处理为分组条形图的现有D3代码可以处理的格式的代码如下所示:
// Call the first mapping function on every 'date' in the data array
processed_data = data.map( function (d) {
var y0 = 0;
var total = 0;
return {
date: d.key,
// Call the second mapping function on every 'state' in the given date array
values: (d.values).map( function (d) {
return_object = {
state: d.key,
count: d.values,
y0: y0,
y1: y0 + d.values
};
// Calculate the updated y0 for each new state in a given date
y0 = y0 + d.values;
// Add the total for a given state to the sum total for that date
total = total + d.values;
return return_object;
}),
total: total
};
});
我们使用嵌套的array.map
转换来将您的两级嵌套数据处理为预期格式,并计算y0
,y1
和total
值。您的processed_data
对象将如下所示:
唯一的另一个棘手的问题是计算您的唯一状态列表,以便定义color.domain
。如果您不想对此进行硬编码(例如,因为列表可能因数据集而异,您可以使用此方法:
// Define the color domain, by first building a list of states:
var states = [];
// Loop through each date
processed_data.forEach(
function (d) {
// Loop through each state in that date
d.values.forEach(
function(d) {
// add to the array if not already present
if (!(states.indexOf(d.state) > -1)) {
states.push(d.state)
}
}
)
}
);
color.domain(states);