d3.js:如何根据 children 和 parents 值调整 D3 分区 table 的大小

d3.js: How to size D3 partition table based on both children and parents value

我正在尝试在 D3 中构建一个基本的冰柱分区树,但我似乎无法让值函数执行我想要的操作。基本上,我希望每个节点的大小根据它的值和它的总和 children。如中所述: d3.js: size of parents = sum of size of children,默认行为根据 children 的总和来调整节点大小。但是,我发现它只查看叶节点,然后根据这些节点调整所有节点的大小。

我有 hard-coded 个值,我希望我的节点大小为 JSON 个值 (totalMass),它已经计算出当前节点的值,它是 children。结果如下:

抱歉,我不能post一张图片,但我可以描述一下:

What I would like:

Root (12 = 5 + Children (3+4))
    Child1 (3 = 1 + Children (2))
        Leaf (2)
    Child2 (4 = 2 + Children (2))
        Leaf (2)
        
What I get:

Root (4)
    Child1 (2)
        Leaf (2)
    Child2 (2)
        Leaf (2)

感谢您的帮助。 因此,我希望所有内容的大小都与根节点的实际值成比例,因此会有一些空白(因为每个节点的值都将高于其 children 的总和)。这也是我实际数据的简化示例,并不是所有的叶节点都不会在同一层上。

有没有办法让值函数像这样工作,或者我是否必须手动调整图表节点的大小?

到目前为止,这是我的代码(在 Typescript 中):

this.svg = d3.select(this.container).append("svg")
            .attr("width", this.width + this.margin.right + this.margin.left)
            .attr("height", this.height + this.margin.top + this.margin.bottom)
            .attr("transform", "translate(" + this.margin.left + "," + this.margin.top + ")");          

        this.rectPartition = this.svg.append("g")
            .attr("transform", "translate(" + this.margin.left + "," + this.margin.top + ")")
            .classed("rect_partition", true);

        // TODO: filter children such that accounts for leaf children of same category
        this.partition = d3.layout.partition()
            .children((d: ChartNode) => {
                var filteredChildren = [];
                if (d.children) {
                    d.children.forEach(child => {
                        if (this.nodeContainsCategory(child, ProductsCategory)) filteredChildren.push(child);
                    });
                    return filteredChildren;
                }
                else return null;
            })
            .value((d: ChartNode) => d.totalMass)
            .sort((a: ChartNode, b: ChartNode) => {
                //first sort by owner, then sort by short name
                if (a.owner === b.owner) return (a.shortName > b.shortName) ? 1 : -1;
                else return (a.owner > b.owner) ? 1 : -1;
            });

我觉得Zoomable Bubble Chart最符合你的要求。你可以为此使用 d3 包布局。

这是此结构的官方 D3 link.. Click here

希望我的推荐对您有所帮助..

嗯,老实说,我和你有同样的问题。显然有一个 pull request 正在处理这个问题:https://github.com/mbostock/d3/pull/574。还有另一种解决方案,Mike Bostock 本人在线程的评论中使用虚拟节点进行了描述。我仍在努力解决这个问题,但也许如果你看一下可能会帮助你解决这个问题(如果你仍然有这个问题)。