跳到主要内容

Stratify

Stratify 模块可以将扁平的数据(表格、数组)转换为层次化的数据。

Stratify 的两种途径:

  • 通过 idparentId
  • 通过 path

示例

name,parent
Eve,
Cain,Eve
Seth,Eve
Enos,Seth
Noam,Seth
Abel,Eve
Awan,Eve
Enoch,Awan
Azura,Eve

使用 csvParse 转换以上 csv 文件:

const table = d3.csvParse(text)

返回形如 {_name_, _parent_} 的对象数组:

[
{ "name": "Eve", "parent": "" },
{ "name": "Cain", "parent": "Eve" },
{ "name": "Seth", "parent": "Eve" },
{ "name": "Enos", "parent": "Seth" },
{ "name": "Noam", "parent": "Seth" },
{ "name": "Abel", "parent": "Eve" },
{ "name": "Awan", "parent": "Eve" },
{ "name": "Enoch", "parent": "Awan" },
{ "name": "Azura", "parent": "Eve" }
]

转换成层级数据 hierarchy:

const root = d3
.stratify()
.id((d) => d.name)
.parentId((d) => d.parent)(table)

stratify()

构造函数。使用默认设置构造一个新的分层运算器。

const stratify = d3.stratify()

stratify(data)

根据指定的表格 data 生成新的层次结构。返回对象中的每个节点都具有相应数据对象的属性的浅拷贝,但不包括以下保留属性:id,parentId,children。

危险

有且只能有一个根节点,否则会报错(Error: 'multiple roots')。

stratify.id(id)

如果指定了 id,则设置 id accessor 为给定函数并返回此分层运算器。否则,返回当前的 id accessor,默认为:

function id(d) {
return d.id
}

对传递给分层运算器的输入数据中的每个元素调用 id accessor,传入当前数据(d)和当前索引(i)。然后使用返回的字符串来识别与父 id 相关的节点关系。对于叶节点,id 可能为 undefined;否则,该 id 必须是唯一的。(Null 和空字符串相当于 undefined。)

stratify.parentId(parentId)

如果指定了 parentId,则将父 id accessor 设置为给定函数并返回此分层运算器。否则,返回当前的父 id accessor,默认为:

function parentId(d) {
return d.parentId
}

为传递给分层运算器的输入数据中的每个元素调用父 id accessor,并传入当前数据(d)和当前索引(i)。然后使用返回的字符串来识别与 id 相关的节点关系。对于根节点,父 id 应该是 undefined。(Null 和空字符串相当于 undefined。)输入数据中必须只有一个根节点,并且没有循环关系。

stratify.path(path)

const paths = [
'axes.js',
'channel.js',
'context.js',
'legends.js',
'legends/ramp.js',
'marks/density.js',
'marks/dot.js',
'marks/frame.js',
'scales/diverging.js',
'scales/index.js',
'scales/ordinal.js',
'stats.js',
'style.js',
'transforms/basic.js',
'transforms/bin.js',
'transforms/centroid.js',
'warnings.js'
]

const root = d3.stratify().path((d) => d)(paths)