Stratify
Stratify 模块可以将扁平的数据(表格、数组)转换为层次化的数据。
Stratify 的两种途径:
- 通过
id
和parentId
- 通过
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)