树状图
示例 · 由 Ben Shneiderman 在 1991 年首次提出,**树状图** 根据每个节点关联的值递归地将区域细分为矩形。D3 的树状图实现支持可扩展的 平铺方法:默认的 方形化 方法试图生成具有 黄金 长宽比的矩形;与 切片和切块 相比,这提供了更好的可读性和尺寸估计,后者只是根据深度交替进行水平和垂直细分。
treemap()
源代码 · 创建一个具有默认设置的新树状图布局。
treemap(root)
源代码 · 布置指定的 root 层次结构,在 root 及其后代上分配以下属性
- node.x0 - 矩形的左边缘
- node.y0 - 矩形的顶边缘
- node.x1 - 矩形的右边缘
- node.y1 - 矩形的底边缘
在将层次结构传递到树状图布局之前,必须调用 root.sum。您可能还想调用 root.sort 来在计算布局之前对层次结构进行排序。
treemap.tile(tile)
源代码 · 如果指定了 tile,则将 平铺方法 设置为指定的函数,并返回此树状图布局。如果未指定 tile,则返回当前的平铺方法,该方法默认为 treemapSquarify,具有黄金分割。
treemap.size(size)
源代码 · 如果指定了 size,则将此树状图布局的大小设置为指定的包含两个元素的数字数组 [width, height],并返回此树状图布局。如果未指定 size,则返回当前的大小,该大小默认为 [1, 1]。
treemap.round(round)
源代码 · 如果指定了 round,则根据给定的布尔值启用或禁用舍入,并返回此树状图布局。如果未指定 round,则返回当前的舍入状态,该状态默认为 false。
treemap.padding(padding)
源代码 · 如果指定了 padding,则将 内部 和 外部 填充设置为指定的数字或函数,并返回此树状图布局。如果未指定 padding,则返回当前的内部填充函数。
treemap.paddingInner(padding)
源代码 · 如果指定了 padding,则将内部填充设置为指定的数字或函数,并返回此树状图布局。如果未指定 padding,则返回当前的内部填充函数,该函数默认为常数零。如果 padding 是一个函数,则它将为每个具有子节点的节点调用,并传递当前节点。内部填充用于分隔节点的相邻子节点。
treemap.paddingOuter(padding)
源代码 · 如果指定了 padding,则将 顶部、右侧、底部 和 左侧 填充设置为指定的数字或函数,并返回此树状图布局。如果未指定 padding,则返回当前的顶部填充函数。
treemap.paddingTop(padding)
源代码 · 如果指定了 padding,则将顶部填充设置为指定的数字或函数,并返回此树状图布局。如果未指定 padding,则返回当前的顶部填充函数,该函数默认为常数零。如果 padding 是一个函数,则它将为每个具有子节点的节点调用,并传递当前节点。顶部填充用于分隔节点的顶部边缘与其子节点。
treemap.paddingRight(padding)
源代码 · 如果指定了 padding,则将右侧填充设置为指定的数字或函数,并返回此树状图布局。如果未指定 padding,则返回当前的右侧填充函数,该函数默认为常数零。如果 padding 是一个函数,则它将为每个具有子节点的节点调用,并传递当前节点。右侧填充用于分隔节点的右侧边缘与其子节点。
treemap.paddingBottom(padding)
源代码 · 如果指定了 padding,则将底部填充设置为指定的数字或函数,并返回此树状图布局。如果未指定 padding,则返回当前的底部填充函数,该函数默认为常数零。如果 padding 是一个函数,则它将为每个具有子节点的节点调用,并传递当前节点。底部填充用于分隔节点的底部边缘与其子节点。
treemap.paddingLeft(padding)
源代码 · 如果指定了 padding,则将左侧填充设置为指定的数字或函数,并返回此树状图布局。如果未指定 padding,则返回当前的左侧填充函数,该函数默认为常数零。如果 padding 是一个函数,则它将为每个具有子节点的节点调用,并传递当前节点。左侧填充用于分隔节点的左侧边缘与其子节点。
树状图平铺
提供了几种内置平铺方法,可用于 treemap.tile。
treemapBinary(node, x0, y0, x1, y1)
源代码 · 递归地将指定的 nodes 分区成一个近似平衡的二叉树,为宽矩形选择水平分区,为高矩形选择垂直分区。
treemapDice(node, x0, y0, x1, y1)
源代码 · 根据指定的 node 的每个子节点的值,在水平方向上将由 x0、y0、x1、y1 指定的矩形区域进行划分。子节点按顺序排列,从给定矩形的左边缘 (x0) 开始。如果子节点的值之和小于指定的 node 的值 (即,如果指定的 node 具有非零的内部值),则剩余的空余空间将位于给定矩形的右边缘 (x1)。
treemapSlice(node, x0, y0, x1, y1)
源代码 · 根据指定node的每个子节点的值,将由x0、y0、x1、y1指定的长方形区域垂直划分为多个子区域。子节点按照顺序排列,从给定长方形的顶部边缘(y0)开始。如果子节点值的总和小于指定node的值(即,指定node具有非零内部值),则剩余的空白区域将位于给定长方形的底部边缘(y1)。
treemapSliceDice(node, x0, y0, x1, y1)
源代码 · 如果指定node的深度为奇数,则委托给treemapSlice;否则委托给treemapDice。
treemapSquarify(node, x0, y0, x1, y1)
源代码 · 使用Bruls等人提出的矩形树状图算法,该算法旨在生成具有给定纵横比的长方形。
treemapResquarify(node, x0, y0, x1, y1)
示例 · 源代码 · 与treemapSquarify类似,但保留了由d3.treemapResquarify计算的先前布局的拓扑结构(节点邻接关系),如果存在且使用了相同的目标纵横比。这种平铺方法适合为树状图动画变化,因为它只改变节点的大小而不改变其相对位置,从而避免了分散的洗牌和遮挡。然而,稳定更新的缺点是,后续更新的布局不是最佳的:只有第一个布局使用Bruls等人提出的矩形树状图算法。
squarify.ratio(ratio)
源代码 · 指定生成的长方形的所需纵横比。ratio必须指定为大于或等于1的数字。注意,生成的长方形的方向(高或宽)不受纵横比的暗示;例如,纵横比为2将尝试生成长宽比为2:1或1:2的混合长方形。(但是,可以通过以不同的尺寸生成方形树状图,然后拉伸树状图到所需的纵横比,来近似实现此结果。)此外,指定的ratio只是一个提示,用于平铺算法;不能保证长方形具有指定的纵横比。如果没有指定,纵横比默认为黄金分割,φ = (1 + sqrt(5)) / 2,根据Kong等人。