如何在Deneb中实现Power BI原生矩阵父组值仅首行显示
问题:Deneb实现Power BI原生矩阵父列首行仅显示效果
我正在尝试使用Deneb创建自定义甘特图可视化,希望添加父列并复刻Power BI原生矩阵的表格格式。已通过calculate函数创建父分组列,但需要实现父分组仅在每组首行显示对应值的效果,使其匹配Power BI原生矩阵样式。目前已有相关配置代码与数据集,寻求技术支持。
当前效果与期望效果
- 当前Deneb效果:父列的分组值(如Fruit、Vegetables)在每个子项行重复显示
- 期望效果:父列分组值仅在每组第一行显示,后续子项行该位置为空,与Power BI原生矩阵样式一致
现有配置代码
{ "data": {"name": "dataset"}, "spacing": 12, "transform": [ { "calculate": "datum['Sort Order'] === 1 || datum['Sort Order'] === 2 || datum['Sort Order'] === 3 ? 'Fruit' : null", "as": "Parent1" }, { "calculate": "datum['Sort Order'] === 4 || datum['Sort Order'] === 5 || datum['Sort Order'] === 6 ? 'Vegetables' : null", "as": "Parent2" }, { "calculate": "datum.Parent1 || datum.Parent2", "as": "Parent" }, { "window": [ {"op": "first_value", "field": "Parent", "as": "Parent Test"} ], "frame": [null, null], "groupby": ["Parent"] }, { "filter": "datum['Parent Test'] !== null" } ], "hconcat": [ { "mark": {"type": "text"}, "encoding": { "y": { "field": "Level 2", "type": "ordinal", "axis": null, "sort": { "field": "Sort Order", "order": "ascending" } }, "text": { "field": "Parent Test" } } }, { "mark": {"type": "text"}, "encoding": { "y": { "field": "Level 2", "type": "ordinal", "axis": null, "sort": { "field": "Sort Order", "order": "ascending" } }, "text": { "field": "Level 2", "type": "nominal" } } } ] }
数据集
| Level 2 | Sort Order | Level 1 |
|---|---|---|
| Strawberry | 1 | Fruit |
| Apple | 2 | Fruit |
| Banana | 3 | Fruit |
| Cucumber | 4 | Vegetable |
| Zuchini | 5 | Vegetable |
| Pepper | 6 | Vegetable |
解决方案
要实现父列仅首行显示,需要在transform中添加组内排名计算,判断当前行是否为组内第一行,仅在第一行显示父分组值,其余行留空。
修改后的完整配置代码
{ "data": {"name": "dataset"}, "spacing": 12, "transform": [ // 直接复用数据集里的Level 1作为父列,无需手动判断Sort Order { "calculate": "datum['Level 1']", "as": "Parent" }, // 按Parent分组,计算组内按Sort Order排序的排名 { "window": [ {"op": "rank", "as": "GroupRank"}, {"op": "first_value", "field": "Parent", "as": "ParentDisplay"} ], "groupby": ["Parent"], "sort": [{"field": "Sort Order", "order": "ascending"}] }, // 仅在组内第一行显示Parent值,其余行设为空字符串 { "calculate": "datum.GroupRank === 1 ? datum.ParentDisplay : ''", "as": "ParentFinal" } ], "hconcat": [ { "mark": {"type": "text"}, "encoding": { "y": { "field": "Level 2", "type": "ordinal", "axis": null, "sort": { "field": "Sort Order", "order": "ascending" } }, "text": { "field": "ParentFinal" } } }, { "mark": {"type": "text"}, "encoding": { "y": { "field": "Level 2", "type": "ordinal", "axis": null, "sort": { "field": "Sort Order", "order": "ascending" } }, "text": { "field": "Level 2", "type": "nominal" } } } ] }
关键修改说明
- 简化父列生成:直接使用数据集已有的
Level 1字段作为父列,避免手动判断Sort Order,适配性更强。 - 组内排名计算:通过
window的rank操作,按Parent分组、Sort Order升序计算每行在组内的排名。 - 控制文本显示:用
calculate判断GroupRank === 1时显示父值,否则显示空字符串,实现仅首行显示的效果。
内容的提问来源于stack exchange,提问作者Downentropy_48
相关产品推荐
相关产品推荐

