从 csv 创建多列维度
Creating multiple column dimension from csv
我正在尝试使用 csv 文件中的多列制作饼图,我可以制作饼图,但它只使用最后一个值 d.gre。我做错了什么?
代码如下
d3.csv("elecVotes.csv", function (data) {
var ndx = crossfilter(data);
var partysDim = ndx.dimension(function(d) { return +d.rep, +d.dem, +d.lib, +d.ind, +d.gre;})
var partys = partysDim.group();
var pie = dc.pieChart('#chart-pie');
pie
.width(180)
.height(180)
.radius(80)
.dimension(partysDim)
.group(partys)
.renderLabel(true)
.innerRadius(10)
.transitionDuration(500)
.colorAccessor(function (d, i) { return d.value; });
dc.renderAll();
});
electVotes.csv
state, rep,dem,lib,ind,gre
Alabama,1314431,725704,44211,20276,9341
New York,5655,54444,65666,2355,12225
Texas,4355,543234,12321,12331,45644
这里有几个问题。在 JavaScript 级别上,逗号 "operator" 只评估逗号的两边,而 returns 第二个。所以
的值
1,2,3,4,5
就是 5
。这样就解释了您当前获得的结果。
另一个问题更具概念性。 Crossfilter 并非旨在显示组中的每一列。我认为主要原因是没有办法按政党过滤,因为每个地区或州对每个政党都有价值观。您需要选民级别的数据才能按政党过滤。
鉴于此限制,您肯定无法通过单击饼图进行过滤。但是,通过一些工作,您可以让饼图将列总和显示为一组的箱子。
正如 Ethan 所说,也许转换数据会更好,但是 this answer shows how to produce a group which rotates the data on the fly。
Gordon 的建议应该可行,但我还敦促您考虑预先将数据转换为更合适的格式。当使用很多不同的工具时,它会在很多方面让你的生活更轻松。具体来说,您需要将文件转换为只有三列:State、Party 和 Votes。如果您在 Excel 中维护此数据,请在那里进行。或者您可以 运行 在您加载的文件上这样做:
var newData = []
data.forEach(function(d) {
newData.push({state: d.state, party: 'rep', votes: d.rep})
newData.push({state: d.state, party: 'dem', votes: d.dem})
newData.push({state: d.state, party: 'lib', votes: d.lib})
newData.push({state: d.state, party: 'ind', votes: d.ind})
newData.push({state: d.state, party: 'gre', votes: d.gre})
})
data = newData
那么您的 Crossfilter 维度和组创建将如下所示:
var ndx = crossfilter(data);
var partysDim = ndx.dimension(function(d) { return d.party;})
var partys = partysDim.group().reduceSum(function(d) { return d.votes;});
同样,这是处理同一问题的另一种方法。我认为预先以正确的方式组织数据会带来巨大的回报,所以我通常建议这样做,然后保持 Crossfilter/dc.js 代码简洁明了。
我正在尝试使用 csv 文件中的多列制作饼图,我可以制作饼图,但它只使用最后一个值 d.gre。我做错了什么?
代码如下
d3.csv("elecVotes.csv", function (data) {
var ndx = crossfilter(data);
var partysDim = ndx.dimension(function(d) { return +d.rep, +d.dem, +d.lib, +d.ind, +d.gre;})
var partys = partysDim.group();
var pie = dc.pieChart('#chart-pie');
pie
.width(180)
.height(180)
.radius(80)
.dimension(partysDim)
.group(partys)
.renderLabel(true)
.innerRadius(10)
.transitionDuration(500)
.colorAccessor(function (d, i) { return d.value; });
dc.renderAll();
});
electVotes.csv
state, rep,dem,lib,ind,gre
Alabama,1314431,725704,44211,20276,9341
New York,5655,54444,65666,2355,12225
Texas,4355,543234,12321,12331,45644
这里有几个问题。在 JavaScript 级别上,逗号 "operator" 只评估逗号的两边,而 returns 第二个。所以
的值1,2,3,4,5
就是 5
。这样就解释了您当前获得的结果。
另一个问题更具概念性。 Crossfilter 并非旨在显示组中的每一列。我认为主要原因是没有办法按政党过滤,因为每个地区或州对每个政党都有价值观。您需要选民级别的数据才能按政党过滤。
鉴于此限制,您肯定无法通过单击饼图进行过滤。但是,通过一些工作,您可以让饼图将列总和显示为一组的箱子。
正如 Ethan 所说,也许转换数据会更好,但是 this answer shows how to produce a group which rotates the data on the fly。
Gordon 的建议应该可行,但我还敦促您考虑预先将数据转换为更合适的格式。当使用很多不同的工具时,它会在很多方面让你的生活更轻松。具体来说,您需要将文件转换为只有三列:State、Party 和 Votes。如果您在 Excel 中维护此数据,请在那里进行。或者您可以 运行 在您加载的文件上这样做:
var newData = []
data.forEach(function(d) {
newData.push({state: d.state, party: 'rep', votes: d.rep})
newData.push({state: d.state, party: 'dem', votes: d.dem})
newData.push({state: d.state, party: 'lib', votes: d.lib})
newData.push({state: d.state, party: 'ind', votes: d.ind})
newData.push({state: d.state, party: 'gre', votes: d.gre})
})
data = newData
那么您的 Crossfilter 维度和组创建将如下所示:
var ndx = crossfilter(data);
var partysDim = ndx.dimension(function(d) { return d.party;})
var partys = partysDim.group().reduceSum(function(d) { return d.votes;});
同样,这是处理同一问题的另一种方法。我认为预先以正确的方式组织数据会带来巨大的回报,所以我通常建议这样做,然后保持 Crossfilter/dc.js 代码简洁明了。