如何在Power BI的Vega-Lite(Deneb)中实现柱内抖动散点图?
Power BI Deneb(Vega-Lite)柱形/条形图内嵌抖动散点图实现方案
核心思路
要实现每个售出商品在对应柱的营收范围内随机分布的散点,需关联明细数据与品类汇总数据,通过数据转换计算散点坐标偏移;同时基于营收排名实现畅销品类的高亮。
步骤1:数据关联与散点坐标计算
利用Vega-Lite的transform完成明细数据与汇总数据的关联,为每个商品计算散点的抖动位置:
- 通过
lookup将明细数据与品类汇总表关联,获取对应品类的总营收 - 计算散点的Y轴坐标:在0到品类总营收范围内随机取值(
random() * datum.total_revenue) - 计算散点的X轴抖动偏移:在柱形宽度范围内左右随机偏移(避免超出柱形)
示例transform配置:
"transform": [ { "lookup": "Category", "from": { "data": {"name": "summary"}, "key": "Category", "fields": ["TotalRevenue"] }, "as": ["total_revenue"] }, { "calculate": "datum.Category + (random() - 0.5) * 0.7", "as": "scatter_x" }, { "calculate": "random() * datum.total_revenue", "as": "scatter_y" }, // 计算营收排名,用于高亮畅销品类 { "window": [{"op": "rank", "field": "total_revenue", "as": "revenue_rank"}], "sort": [{"field": "total_revenue", "order": "descending"}] } ]
步骤2:图层组合(柱形+散点)
使用Vega-Lite的layer将柱形图与散点图叠加:
- 底层为品类汇总柱形图,设置基础样式
- 上层为抖动散点图,使用计算出的
scatter_x和scatter_y作为坐标
步骤3:畅销品类高亮
通过condition编码实现柱形、散点及轴标签的高亮:
- 柱形与散点:判断
revenue_rank === 1时使用高亮色 - X轴标签:同样通过
condition为畅销品类设置加粗/变色样式
完整示例代码
{ "$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"name": "dataset"}, "datasets": { "summary": [ // 替换为你的汇总数据,或直接关联Power BI的汇总表 {"Category": "品类A", "TotalRevenue": 15000}, {"Category": "品类B", "TotalRevenue": 22000}, {"Category": "品类C", "TotalRevenue": 18000} ] }, "transform": [ { "lookup": "Category", "from": { "data": {"name": "summary"}, "key": "Category", "fields": ["TotalRevenue"] }, "as": ["total_revenue"] }, { "calculate": "datum.Category + (random() - 0.5) * 0.7", "as": "scatter_x" }, { "calculate": "random() * datum.total_revenue", "as": "scatter_y" }, { "window": [{"op": "rank", "field": "total_revenue", "as": "revenue_rank"}], "sort": [{"field": "total_revenue", "order": "descending"}] } ], "layer": [ // 柱形图层 { "mark": {"type": "bar", "width": 0.8}, "encoding": { "x": {"field": "Category", "type": "nominal"}, "y": {"field": "total_revenue", "type": "quantitative"}, "color": { "condition": {"test": "datum.revenue_rank === 1", "value": "#e63946"}, "value": "#a8dadc" } } }, // 散点图层 { "mark": {"type": "point", "size": 30, "opacity": 0.6}, "encoding": { "x": {"field": "scatter_x", "type": "nominal", "axis": null}, "y": {"field": "scatter_y", "type": "quantitative", "axis": null}, "color": { "condition": {"test": "datum.revenue_rank === 1", "value": "#1d3557"}, "value": "#457b9d" } } } ], "config": { "axis": { "x": { "labelFontWeight": { "condition": {"test": "datum.revenue_rank === 1", "value": "bold"}, "value": "normal" }, "labelColor": { "condition": {"test": "datum.revenue_rank === 1", "value": "#e63946"}, "value": "#333" } } } } }
关键说明
- 若使用Power Query转换的单条商品行数据,直接将
dataset关联为该数据源即可 - 抖动范围(
0.7)可根据柱宽调整,避免散点超出柱形边界 - 随机数基于每个明细行计算,确保每个商品对应唯一散点
内容的提问来源于stack exchange,提问作者PBI DataVizzle
相关产品推荐
相关产品推荐

