You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vega-Lite累积密度柱状图无数据分箱区间显示空白问题

问题根因

断层是Vega-Lite变换的默认执行逻辑导致的,和CDF计算逻辑本身无关:

  • 原markArea实现用连续数值x轴,直接基于逐行原始数据做窗口累积计算,尺度渲染时会自动将最后一个有效数据点的y值水平延伸到x轴定义域终点,因此无样本区间不会出现视觉断层。
  • 切换为markRect+bin分箱后,bin变换默认仅生成包含至少1条原始数据的分箱记录,240-300区间无对应学生样本,不会生成该分箱的聚合行,后续窗口变换拿不到该区间的累积值,自然无法绘制矩形,出现空白。
调整方案

按以下顺序修改配置即可实现连续累积柱状效果,核心是补全空分箱的记录并填充正确的累积值:

  • 固定分箱边界:给bin配置显式传入extent参数,取值和原面积图的x轴domain完全一致,即bin: {"maxbins": 20, "extent": [0, max_y_scale_value_for_d]},避免bin自动裁剪分箱范围。
  • 调整变换执行顺序:不要直接对原始逐行数据做窗口计算,先按分箱维度聚合每个区间的样本数,再基于分箱排序计算累积计数,避免冗余计算。
  • 补全空分箱数值:在窗口变换后新增impute步骤,对缺失的分箱条目做前向填充(ffill),空分箱的累积值直接继承前一个有效分箱的结果,完全匹配CDF“无新增样本则累积值不变”的逻辑。

核心配置参考:

"transform": [
  // 字符串字段转数值,逻辑与原面积图一致
  {"calculate": "toNumber(datum.d)", "as": "d2"},
  {"calculate": "toNumber(datum.e)", "as": "e2"},
  // 固定范围分箱
  {"bin": {"maxbins": 20, "extent": [0, 300]}, "field": "d2", "as": ["bin_start", "bin_end"]},
  // 按分箱聚合单区间样本数
  {"aggregate": [{"op": "count", "as": "bin_count"}], "groupby": ["bin_start", "bin_end"]},
  // 按分箱起始位置升序排序,计算累积计数
  {
    "sort": [{"field": "bin_start", "order": "ascending"}],
    "window": [{"op": "sum", "field": "bin_count", "as": "cumulative_count"}],
    "frame": [null, 0]
  },
  // 补全所有空分箱,前向填充累积值,step为分箱宽度(0-300分20箱时宽度为15)
  {
    "impute": "cumulative_count",
    "key": "bin_start",
    "keyvals": {"start": 0, "step": 15, "stop": 300},
    "method": "ffill"
  }
],
"mark": "rect",
"encoding": {
  "x": {"field": "bin_start", "type": "quantitative", "scale": {"domain": [0, 300]}},
  "x2": {"field": "bin_end"},
  "y": {"field": "cumulative_count", "type": "quantitative"},
  "y2": {"value": 0}
}

配置提示:keyvals里的step值要和maxbins对应的单箱宽度匹配,比如x轴范围0-300、maxbins=20时单箱宽度为15,确保每个分箱的起始key都能被覆盖,不会漏补。

内容的提问来源于stack exchange,提问作者Mahesha999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:54:26