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"] } ] }
关键修改点说明
- 全阶段数据源:新增
allPhases列出所有需要显示的阶段,通过lookup和flatten转换,保证每个阶段都有对应的分组,哪怕没有项目数据 - 阶段排序:分组的
sort配置用phaseScale刻度的顺序,确保阶段完全按你指定的顺序排列 - 钻取支持:给文本标记加上
interactive: true和ariaRoleDescription,让Power BI识别这是可钻取的数据点;同时加了透明度条件,没数据的时候不会显示空元素 - 空数据处理:符号和文本标记都加了透明度判断,无项目数据时隐藏元素,但保留阶段标题,符合你的需求
内容的提问来源于stack exchange,提问作者ora sha
相关产品推荐
相关产品推荐

