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

如何在Vega-Lite中制作区分实际与目标值配色的简易华夫饼图

Vega-Lite 实现区分实际/目标值的华夫饼图

以下是满足需求的实现方案:通过生成网格数据、条件标记格子类型,实现实际值与目标值的配色区分,且当实际值超过目标值时自动隐藏目标部分。

完整代码示例

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "description": "华夫饼图:区分实际值与目标值,实际超目标时隐藏目标部分",
  "data": {
    "values": [{"actual": 75, "target": 100}] // 替换为你的实际数据
  },
  "transform": [
    // 生成10x10网格(总单位数100,可调整stop值改变网格大小)
    {"sequence": {"start": 0, "stop": 10, "as": "row"}},
    {"sequence": {"start": 0, "stop": 10, "as": "col"}},
    {"cross": {"with": "data"}},
    // 计算每个格子的索引(从0开始计数)
    {"calculate": "datum.row * 10 + datum.col", "as": "index"},
    // 标记格子所属类型:实际值、目标值(仅当实际<目标时)、空白
    {
      "calculate": "datum.index < datum.actual ? '实际值' : (datum.index < datum.target && datum.actual < datum.target ? '目标值' : '空白')",
      "as": "type"
    },
    // 过滤掉空白格子,只显示有效部分
    {"filter": "datum.type != '空白'"}
  ],
  "mark": "square",
  "encoding": {
    "x": {"field": "col", "type": "ordinal", "axis": null},
    "y": {"field": "row", "type": "ordinal", "axis": null},
    "color": {
      "field": "type",
      "type": "nominal",
      "scale": {
        "domain": ["实际值", "目标值"],
        "range": ["#2ECC71", "#E74C3C"] // 自定义配色,可按需修改
      },
      "legend": {"title": ""}
    },
    "size": {"value": 300} // 调整格子大小,适配你的显示需求
  },
  "config": {
    "view": {"stroke": null} // 隐藏图表边框
  }
}

关键逻辑说明

  • 网格生成:通过sequence生成行和列数据,cross将网格与实际/目标数据合并,构建华夫饼的基础网格。这里用10x10网格代表100个单位,若需要不同总单位数,修改sequence的stop值即可(比如设为8则是8x8=64单位)。
  • 类型标记:通过条件判断为每个格子标记类型:
    • 索引小于实际值的格子标记为「实际值」
    • 仅当实际值小于目标值时,索引在实际值到目标值之间的格子标记为「目标值」
    • 其余格子标记为「空白」并被过滤
  • 配色控制:在color编码的scale中自定义实际值和目标值的颜色,直接修改range数组即可更换配色。
  • 超目标处理:当实际值≥目标值时,「目标值」的标记条件不成立,不会生成对应格子,自然隐藏目标部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:40:25