Power BI Deneb中如何用Vega dataset字段填充Sankey图input数据
解决Power BI Deneb中Vega Alluvial Sankey图引用数据集字段的问题
核心误区纠正
你之前用datum['Measure1']无效的原因是:datum是Vega数据流转过程中单条数据的引用变量,不能直接在数据源输入(input.values)里使用。Deneb会把Power BI筛选后的数据集暴露为全局信号dataset,你需要直接用这个信号导入数据,再通过Vega的转换逻辑生成Sankey图需要的节点/链接结构。
具体实现步骤
- 导入Power BI数据集
在Vega的data区块中,直接通过{"signal": "dataset"}引用Power BI的筛选后数据,不需要手动编写values:
"data": [ { "name": "pb_data", "values": {"signal": "dataset"} // 直接拉取Power BI的数据集 } ]
确保你已经在Deneb的字段面板中添加了Measure1、Measure2、Measure3以及需要的度量值(比如流量值),这样dataset里才会包含这些字段。
- 转换数据为Sankey所需结构
Alluvial Sankey图需要两个核心数据结构:
- 节点列表:包含所有层级的唯一值(Measure1/2/3的所有不同值)
- 链接列表:包含层级间的关联关系和流量值
用Vega的transform完成转换,示例如下:
"data": [ { "name": "pb_data", "values": {"signal": "dataset"}, // 生成节点列表:合并三个Measure的所有值并去重 "transform": [ {"type": "fold", "fields": ["Measure1", "Measure2", "Measure3"], "as": ["layer", "node_name"]}, {"type": "aggregate", "groupby": ["node_name"]}, {"type": "sequence", "start": 0, "stop": {"signal": "length(data('pb_data'))"}, "as": "node_id"}, {"name": "sankey_nodes"} ] }, { "name": "sankey_links", "source": "pb_data", // 生成Measure1→Measure2的链接 "transform": [ {"type": "lookup", "from": "sankey_nodes", "key": "node_name", "fields": ["Measure1"], "as": ["source_node"]}, {"type": "lookup", "from": "sankey_nodes", "key": "node_name", "fields": ["Measure2"], "as": ["target_node"]}, {"type": "aggregate", "groupby": ["source_node.node_id", "target_node.node_id"], "ops": ["sum"], "fields": ["Your_Metric"], "as": ["flow_value"]}, // 追加Measure2→Measure3的链接 {"type": "union", "tables": [ {"data": "pb_data", "transform": [ {"type": "lookup", "from": "sankey_nodes", "key": "node_name", "fields": ["Measure2"], "as": ["source_node"]}, {"type": "lookup", "from": "sankey_nodes", "key": "node_name", "fields": ["Measure3"], "as": ["target_node"]}, {"type": "aggregate", "groupby": ["source_node.node_id", "target_node.node_id"], "ops": ["sum"], "fields": ["Your_Metric"], "as": ["flow_value"]} ]} ]} ] } ]
替换Your_Metric为你用来表示流量的度量值(比如计数、销售额等)。
- 配置Sankey图的Mark和Encoding
用转换后的nodes和links数据渲染图表:
"mark": { "type": "sankey", "node": {"fill": "#636efa", "stroke": "#fff"}, "link": {"fillOpacity": 0.4} }, "encoding": { "source": {"field": "source_node.node_id", "type": "ordinal"}, "target": {"field": "target_node.node_id", "type": "ordinal"}, "value": {"field": "flow_value", "type": "quantitative"} }, "config": { "sankey": {"nodeWidth": 20, "nodePadding": 10} }
关键注意事项
- 确保Power BI的筛选上下文已经生效:Deneb的
dataset会自动继承当前页面/视觉对象的筛选器,不需要额外处理。 - 如果
Measure1/2/3是度量值而非维度列,要注意其返回的是聚合后的值,可能需要调整转换逻辑。 - 若节点名称重复(比如不同层级有相同值),可以在
fold步骤中给节点名称加上层级前缀(比如Measure1_+value)避免冲突。
内容的提问来源于stack exchange,提问作者mmallya
相关产品推荐
相关产品推荐

