数据可视化【免费下载链接】vegaA visualization grammar.项目地址https://gitcode.com/gh_mirrors/ve/vega点击查看免费下载quantile变换是 Vega5.7 版本起引入中用于对输入数据流计算经验分位数empirical quantile的核心统计变换。本文以官方文档 quantile.md 为主体结合 Quantile.js 源码与测试用例系统讲解其全部参数、输出结构、底层实现原理并给出基于 quantile-quantile-plot.vg.json 的完整 Q-Q 图实战方案。读完本文你将能够熟练运用quantile变换完成分位数估计、分组统计与分布对比可视化。一、quantile 变换是什么quantile变换用于计算输入数据流的经验分位数。所谓分位数就是将一组数据按数值升序排列后位于某个累积概率位置处的取值——例如 0.5 分位数即中位数0.25 / 0.75 分位数即上下四分位数。它的典型特征包括输出新数据对象变换会为每个概率值生成一条新的数据记录默认包含prob与value两个字段而非修改原有数据。支持分组通过groupby参数可分别为每组数据独立估计分位数。典型用途构建分位数-分位数Q-Q图将经验分布与理论分布如正态、均匀分布进行对比。在 Vega 的数据管道中quantile属于基本变换Basic Transform一类通常写在 data 定义的transform数组中。所有变换都要求至少提供type属性见 transforms.md。二、变换参数详解quantile变换共支持 5 个参数其中仅field为必填项属性类型必填默认值说明fieldField是—用于计算分位数的数据字段名groupbyField[]否—分组字段数组未指定时将所有数据作为一个分组probsNumber[]否—需要计算分位数的概率数组取值范围 (0, 1)若未指定则使用step参数stepNumber否0.01概率步长用于采样分位数值从半个步长开始一直采样到 1不含 1。仅当未提供probs时生效asString[]否[prob, value]输出字段名分别对应概率值与分位数值以上参数与源码中 Quantile.Definition 的定义一一对应Quantile.Definition { type: Quantile, metadata: {generates: true, changes: true}, params: [ { name: groupby, type: field, array: true }, { name: field, type: field, required: true }, { name: probs, type: number, array: true }, { name: step, type: number, default: 0.01 }, { name: as, type: string, array: true, default: [prob, value] } ] };值得注意的源码细节元数据{generates: true, changes: true}表明这是一个产生新数据的变换这也是它必须放在data的transform数组中的原因step在定义层的默认值即0.01与文档一致probs与step互斥probs优先未提供时回退到step。三、概率采样逻辑probs 与 step 的取舍从 Quantile.js 的实现可以看到概率序列的生成方式const step _.step || 0.01, p _.probs || range(step/2, 1 - EPSILON, step);若显式提供probs则直接使用该数组例如[0.25, 0.50, 0.75]否则按step生成等差概率序列从step/2开始以step为间隔直到1 - EPSILONEPSILON 1e-14用于排除端点 1。以默认step 0.01为例生成的序列为0.005, 0.015, 0.025, ..., 0.995共 100 个概率点若step 0.05则序列为0.025, 0.075, ..., 0.975共 20 个概率点——这正是从半个步长开始、1 为开区间这一规则的直观含义。这种对称的采样方式使最大/最小概率点与分布两端保持等距避免在 0 与 1 这两个不稳定端点处采样。四、输出字段与分组行为每次计算变换会为每一个概率值输出一条数据对象。默认输出字段为prob概率值来自probs或step采样序列value对应的分位数值。字段名可通过as参数自定义例如as: [p, q]后将输出p与q两个字段。groupby参数控制分组粒度。从 partition 函数 的实现看groupby为null时全部数据作为一个分组直接提取field字段值提供groupby时按分组键值组键由groupby各字段取值拼接而成将数据切分为多个分组每组独立计算分位数输出对象中会额外携带各分组键字段键名取自accessorName便于下游按组区分结果。因此当groupby: [category]且probs: [0.25, 0.50, 0.75]时每个category分组都会生成 3 条输出记录分别携带该组的category键值。五、基础使用示例以下示例均来自官方文档可直接放入数据定义的transform数组中使用。示例一计算四分位数边界对输入数据字段value计算上、下四分位数与中位数{type: quantile, field: value, probs: [0.25, 0.50, 0.75]}输出三条记录prob依次为0.25、0.50、0.75value为对应的分位数值。示例二计算 20 个等距分位数不指定probs通过step: 0.05自动采样序列从 0.025 到 0.975{type: quantile, field: value, step: 0.05}输出 20 条记录均匀覆盖经验分布从低到高的位置。示例三分组分位数组合使用按category分组分别计算各组的中位数{ type: quantile, field: value, groupby: [category], probs: [0.50] }示例四自定义输出字段名{ type: quantile, field: value, probs: [0.25, 0.50, 0.75], as: [p, q] }六、实战用 quantile 构建 Q-Q 图quantile变换最经典的落地场景是 quantile-quantile-plot 示例它将经验数据分位数与理论分布分位数逐一对比若两者同分布散点会近似落在一条直线上。该示例quantile-quantile-plot.vg.json的数据管道如下{ name: quantiles, source: points, transform: [ { type: quantile, field: u, step: {signal: 1 / (numQuantiles 1)} }, { type: formula, as: quniform, expr: quantileUniform(datum.prob) }, { type: formula, as: qnormal, expr: quantileNormal(datum.prob) } ] }该管道的精妙之处step由 signal 驱动step: {signal: 1 / (numQuantiles 1)}将步长绑定到交互式 signal默认numQuantiles 100用户拖动滑块即可动态改变采样密度20 到 200 个分位点从而控制 Q-Q 图的点数理论分位数来自表达式函数quantileUniform(datum.prob)与quantileNormal(datum.prob)是 Vega 内置的统计表达式函数见 expressions.md分别返回均匀分布与正态分布的理论分位数数据对比quniform/qnormal字段作为 X 轴理论分位数value字段作为 Y 轴经验分位数逐点绘制 symbol 标记即可直观观察两条分布曲线的偏差。完整示例可通过docs/examples/quantile-quantile-plot.vg.json在 Vega 编辑器或 vega 包 中运行查看数据源支持在data/normal-2d.json正态样本与data/uniform-2d.json均匀样本之间切换。七、源码级实现原理7.1 变换主体Quantile.jsQuantile.js 的核心transform方法执行流程如下增量短路若变换已有输出且参数未修改、数据未变化直接返回上次结果out.source this.value避免无谓重算物化数据源pulse.materialize(pulse.SOURCE).source获取全量数据分组调用partition将数据按groupby切分为若干组或单组生成概率序列probs优先否则range(step/2, 1 - EPSILON, step)逐组计算对每组调用quantiles(g, p)批量求分位数并为每个概率构造输出对象携带组键 as[0]概率 as[1]分位数值增量更新用out.rem移除旧输出、out.add添加新输出实现数据流级联更新。7.2 分位数计算vega-statistics/quantiles底层数值计算在 vega-statistics/src/quantiles.jsconst values Float64Array.from(numbers(array, f)); values.sort(ascending); return p.map(_ quantileSorted(values, _));先将字段值提取并转换为Float64Array浮点数组numbers工具负责过滤非数值并转换用 d3-array 的ascending比较器原地升序排序注释特别说明不依赖 typed array 的默认 sort 返回值以规避 Safari 的排序缺陷见 vega/vega-lite#4964 的相关处理最后对已排序数组调用 d3-array 的quantileSorted完成线性插值分位计算。同一模块还提供了便捷函数 quartiles.js直接返回[0.25, 0.50, 0.75]三个分位数——与quantile变换配合probs: [0.25, 0.50, 0.75]的结果完全一致。八、行为验证测试用例解读quantile-test.js 用 tape 框架完整验证了变换的三种数据流行为插入insert对数据[9, 8, 7, 1, 2, 3, 6, 5, 4]计算[0.25, 0.50, 0.75]分位数断言输出恰好 3 条记录且结果为{prob: 0.25, value: 3}、{prob: 0.50, value: 5}、{prob: 0.75, value: 7}删除remove移除v 2或v 8的数据后分位数重算为3.5 / 5.0 / 6.5且rem中移除旧输出 3 条修改modify将所有字段值1后分位数变为4.5 / 6.0 / 7.5。该测试同时确认了变换的增量语义任何源数据变化都会导致全部输出记录被替换重算add与rem数量一致保证下游视图始终与最新数据同步。九、使用注意事项字段缺失与非数值处理quantile依赖vega-statistics的numbers工具提取数值非数值项会被过滤若某分组没有可计算的数值将无法产出有效分位数需结合filter变换见 transforms.md预处理空值。step 与 probs 互斥同时提供时probs生效step被忽略。输出数量无groupby时输出probs.length或 step 序列长度条记录有groupby时乘以分组数。适用范围该变换适合静态分布分析若数据高频增量变化且追求极致性能可考虑在数据层控制触发频率如通过 signal 驱动的step采样。十、小结quantile变换是 Vega 中为数不多的纯统计产出型基本变换一条配置即可完成经验分位数估计、分组统计与概率-分位数值对的输出。结合groupby可做分组对比结合 signal 驱动的step可实现交互式采样密度控制而配合quantileUniform/quantileNormal等表达式函数则能快速搭建专业的 Q-Q 图。本文涉及的实现细节概率采样规则、增量更新语义、底层 d3-array 排序与插值均可在 Quantile.js、quantiles.js 与 quantile-test.js 中进一步研读验证。赞分享数据可视化【免费下载链接】vegaA visualization grammar.项目地址https://gitcode.com/gh_mirrors/ve/vega点击查看免费下载相关推荐Altair 分位数变换Quantile Transform完全指南从经验分位数到 Q-Q 图Altair 分位数变换Quantile Transform完全指南从经验分位数到 Q Q 图 分位数Quantile是描述数据分布形态的核心统计量。数据可视化用 Vega 构建分位数-分位数Q-Q图quantile 变换与理论分位数表达式的完整实战用 Vega 构建分位数 分位数Q Q图quantile 变换与理论分位数表达式的完整实战 本文以 Vega 仓库内置的 quantile quantil数据可视化Presto Quantile Digestqdigest函数完全指南近似分位数计算与数据草图实战Presto Quantile Digestqdigest函数完全指南近似分位数计算与数据草图实战 本指南系统讲解 PrestoTrino 前身体系中的大数据数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考