跳至内容

树状图

Treemap

示例 · 由 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 的每个子节点的值,在水平方向上将由 x0y0x1y1 指定的矩形区域进行划分。子节点按顺序排列,从给定矩形的左边缘 (x0) 开始。如果子节点的值之和小于指定的 node 的值 (,如果指定的 node 具有非零的内部值),则剩余的空余空间将位于给定矩形的右边缘 (x1)。

treemapSlice(node, x0, y0, x1, y1)

源代码 · 根据指定node的每个子节点的值,将由x0y0x1y1指定的长方形区域垂直划分为多个子区域。子节点按照顺序排列,从给定长方形的顶部边缘(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等人