我正在做这样的事情,http://bl.ocks.org/mbostock/1283663 但我希望父母的大小是孩子大小的平均值。我找到了一个解决方案,但它仅适用于最后一个父级。我的主张是实现新的函数平均值
function average(d) {
if (d.children !=null){
return d3.sum(d.children, function(d) {return d.value;})/d.children.length;}
else{
return d.value;
}
}
然后我替换所有出现的
.attr("width", function(d) { return x(d.value); })
与
.attr("width", function(d) { return x(average(d)); })
但它只计算最新父母及其子女的平均值。你有什么想法我如何纠正这个功能来计算所有父母的平均值? 这是我第三次提出这个问题,但请理解我,这对我来说非常有趣,我知道如果有人帮助我,我会找到解决方案 非常感谢
答案 0 :(得分:0)
首先,您不需要发明一个新函数来查找对象数组中每个元素的某个属性的平均值。您可以使用d3.mean
。
你可以使用递归函数向每个有子节点的节点添加一个新属性,称之为averageChildValue
。
例如,你可以这样做:
function recurse(node) {
// IF A NODE HAS CHILDREN...
if (node.children) {
// ADD A PROPERTY REPRESENTING THE AVG VALUE OF ITS CHILDREN
node.averageChildValue = d3.mean(node.children, function(d) {
return d.value;
});
// RECURSIVELY CALL THE FUNCTION ON THE CHILDREN
node.children.forEach(function(d) { recurse(d); });
}
}
d3.json("readme.json", function(error, root) {
// PARTITION THE DATA
partition.nodes(root);
// USE THE RECURSIVE FUNCTION TO CALCULATE THE AVERAGES
recurse(root)
// DO SOMETHING WITH YOUR NEW-AND-IMPROVED DATA
console.log(root)
});
检查您的控制台输出,每个带有子节点的节点现在应该有一个名为averageChildValue
的额外属性。