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

Power BI Deneb自定义可视化:多阶段小倍数图表问题排查

解决Deneb(Vega)Power BI自定义可视化的三个问题

修复方案

1. 显示无数据的阶段

原来的代码只根据现有数据分组,没数据的阶段根本不会生成对应的列。要解决这个,得先做个包含所有指定阶段的数据集,再和业务数据做左连接,保证每个阶段都能被渲染出来:

  • 新增allPhases数据源,把所有需要显示的阶段列进去
  • 通过lookup转换把业务数据和全阶段数据关联起来,确保每个阶段都存在,哪怕没有项目

2. 按指定顺序排序阶段

原来按阶段名称的字符串排序,肯定不符合要求。得用预定义的phaseScale刻度来拿阶段的排序权重,以此作为排序依据:

  • 在分组的sort配置里,用scale('phaseScale', datum.Gating_Phase)获取阶段的顺序值,按这个值升序排列

3. 修复项目名称的钻取功能

Power BI的钻取需要把可视化元素标记成可交互的数据点,所以要给文本标记加交互配置:

  • 给文本标记加interactive: true
  • 设置ariaRoleDescription: "data point",让Power BI认出这是可钻取的元素
  • 保留项目名称字段的原始绑定,确保钻取的上下文是对的

修改后的完整代码

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "data": [
    {"name": "dataset"},
    {
      "name": "allPhases",
      "values": [
        {"Gating_Phase": "Ideation"},
        {"Gating_Phase": "Initiating"},
        {"Gating_Phase": "Planning"},
        {"Gating_Phase": "Executing"},
        {"Gating_Phase": "Closing"},
        {"Gating_Phase": "Completed"},
        {"Gating_Phase": "Deferred"},
        {"Gating_Phase": "Off-Ramped"}
      ]
    },
    {
      "name": "facetSource",
      "source": "allPhases",
      "transform": [
        {
          "lookup": "Gating_Phase",
          "from": {"data": "dataset", "key": "Gating_Phase"},
          "fields": ["Project Name", "Overall_Health"],
          "as": ["Project Name", "Overall_Health"],
          "default": []
        },
        {"flatten": ["Project Name", "Overall_Health"]}
      ]
    }
  ],
  "signals": [
    {"name": "gridColumns", "value": 8},
    {"name": "gridPadding", "value": 5}
  ],
  "marks": [
    {
      "type": "group",
      "layout": {
        "align": "all",
        "bounds": "full",
        "columns": {"signal": "gridColumns"},
        "padding": {"signal": "gridPadding"}
      },
      "marks": [
        {
          "type": "group",
          "from": {
            "facet": {
              "name": "facetData",
              "data": "facetSource",
              "groupby": "Gating_Phase"
            }
          },
          "sort": {"field": "datum.Gating_Phase", "order": "ascending", "sort": {"field": "datum.Gating_Phase", "scale": "phaseScale"}},
          "encode": {
            "enter": {
              "width": {"value": 180},
              "height": {"value": 250}
            }
          },
          "title": {
            "text": {"signal": "parent['Gating_Phase']"},
            "anchor": "start",
            "fontSize": {"value": 14},
            "fontWeight": "bold"
          },
          "marks": [
            {
              "type": "symbol",
              "from": {"data": "facetData"},
              "encode": {
                "enter": {
                  "x": {"value": 50},
                  "y": {"scale": "yScale", "field": "Project Name"},
                  "size": {"value": 100},
                  "fill": {"scale": "colorScale", "field": "Overall_Health"},
                  "opacity": {"condition": {"test": "datum['Project Name'] == null", "value": 0}, "value": 1}
                }
              }
            },
            {
              "type": "text",
              "from": {"data": "facetData"},
              "interactive": true,
              "encode": {
                "enter": {
                  "x": {"value": 70},
                  "y": {"scale": "yScale", "field": "Project Name"},
                  "text": {"field": "Project Name"},
                  "fill": {"value": "black"},
                  "fontSize": {"value": 10},
                  "baseline": {"value": "top"},
                  "lineBreak": {"value": " "},
                  "ariaRoleDescription": {"value": "data point"},
                  "opacity": {"condition": {"test": "datum['Project Name'] == null", "value": 0}, "value": 1}
                }
              }
            }
          ]
        }
      ]
    }
  ],
  "scales": [
    {
      "name": "phaseScale",
      "type": "ordinal",
      "domain": ["Ideation", "Initiating", "Planning", "Executing", "Closing", "Completed", "Deferred", "Off-Ramped"],
      "range": "width"
    },
    {
      "name": "yScale",
      "type": "point",
      "domain": {"data": "dataset", "field": "Project Name"},
      "range": [40, 200]
    },
    {
      "name": "colorScale",
      "type": "ordinal",
      "domain": ["3 - Red", "2 - Amber", "1 - Green"],
      "range": ["#d7191c", "#fdae61", "#1a9641"]
    }
  ]
}

关键修改点说明

  1. 全阶段数据源:新增allPhases列出所有需要显示的阶段,通过lookup和flatten转换,保证每个阶段都有对应的分组,哪怕没有项目数据
  2. 阶段排序:分组的sort配置用phaseScale刻度的顺序,确保阶段完全按你指定的顺序排列
  3. 钻取支持:给文本标记加上interactive: true和ariaRoleDescription,让Power BI识别这是可钻取的数据点;同时加了透明度条件,没数据的时候不会显示空元素
  4. 空数据处理:符号和文本标记都加了透明度判断,无项目数据时隐藏元素,但保留阶段标题,符合你的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:05:18