【发布时间】:2014-10-19 10:21:32
【问题描述】:
我正在重新创建this population pyramid by Mike Bostock。我有一个关于.data() 工作原理的基本问题。
我在 CSV 文件中有这样的数据:
所以,我有每个 region(dodoma、arusha 等)中的男性和女性人数。按照 Mike 的示例,我想创建一个条形图,其中男性和女性占据不同的 rects,与 80% 的 opacity 重叠。我希望region 成为我的 x 轴,人数成为我的 y 轴。这是我的 x 轴和 y 轴刻度:
var x = d3.scale.ordinal()
.rangeRoundBands([0, w], 0.05);
var y = d3.scale.linear()
.range([0, h-padding]);
这是我在每个地区对男性+女性进行分组的尝试:
var regions = svg.append("g")
.classed("regions", true);
var region = regions.selectAll(".region")
.data(dataset)
.enter()
.append("g")
.attr("class", "region")
.attr("transform", function(region) { return "translate(" + x(region) + ",0)"; });
region.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("x", function(d, i) {
return x(i);
})
.attr("y", function(d) { return h - y(d.people_0); })
.attr("width", barWidth)
.attr("height", function(d) { return y(d.people_0); });
我最终得到了这个:
也就是说,我最终得到了 50 个 g 元素,它们具有所有数据,并且正在为每个性别区域对创建完整的条形图(来自 Dodoma 的男性,来自 Dodoma 的女性; 来自 Tanga 的男性、来自 Tanga 的女性等)。整个图表因此被重绘了 50 次。我有 25 个地区,所以我想要 25 个 g 元素,只有该地区的男性/女性号码。
我认为这一切都可以与.data() 联系起来。但我不知道如何告诉 d3 我想按区域对我的观察结果进行分组,最后得到 2 个rects 每g。
Here's my JSFiddle(虽然我不知道如何加载我的外部数据 - 所以什么都没有显示;任何提示都将不胜感激)。
编辑添加:
鉴于 Benjamin 的评论,我尝试使用 .nest。所以我有:
dataset = d3.nest()
.key(function(d) { return d.round; })
.key(function(d) { return d.region; })
.rollup(function(v) { return v.map(function(d) { return d.people_0; }); })
.map(dataset);
现在我像这样打电话给我的rects:
region.selectAll("rect")
.data(function(region) { return data[round][region]; })
.enter()
.append("rect")
.attr("x", function(d, i) {
return x(i);
})
.attr("y", function(d) { return h - y(d.people_0); })
.attr("width", barWidth)
.attr("height", function(d) { return y(d.people_0); });
运气不好。 FWIW,console.log(dataset) 向我展示了数据确实已被汇总。但我仍然无法调用它并将其与我的 g.region 元素关联。
有人能解释一下data[round][region] 的作用吗?我不明白 d3 是如何解释这个的。
【问题讨论】:
-
您是否像示例中那样做了“nest()”?在您链接的示例中,这将按
year和age对数据进行分组。您必须为区域做同样的事情。 -
@BenjaminUdinktenCate - 谢谢。试过
.nest,但还是不行。现在没有一个矩形出现,g.region元素丢失了。按照这个建议,我已经用其他信息更新了我的问题。我认为我的主要困惑是如何根据需要调用.data()。 -
data[round][region]访问二维数组。您将数据绑定两次;试试region.append("rect")。您可以将.each(function(d){console.log(d)})放在链中的下一个,以确保rects 拥有其父g的数据。
标签: d3.js