如何在Vega中基于单数据集用pie transform创建分组独立饼图?
实现分组独立饼图作为网络图节点
要让每个group生成独立的饼图,核心是在pie变换中指定分组字段,结合窗口变换计算组内占比,具体修改如下:
关键修改步骤
- 先通过
window变换按group分组,计算每组内field的总和,为饼图扇区占比计算提供基础 - 在
pie变换中添加groupby参数指定group字段,让每个组独立计算饼图的起始/结束角度 - 为不同组的饼图设置独立的坐标位置(后续可替换为网络图布局的节点坐标)
修改后的完整Vega规范
{ "$schema": "https://vega.github.io/schema/vega/v5.json", "description": "分组独立饼图示例", "width": 400, "height": 200, "autosize": "none", "data": [ { "name": "table", "values": [ {"id": 1, "field": 4, "group": 1}, {"id": 2, "field": 6, "group": 1}, {"id": 3, "field": 10, "group": 1}, {"id": 4, "field": 3, "group": 2}, {"id": 5, "field": 7, "group": 2}, {"id": 6, "field": 8, "group": 2} ], "transform": [ { "type": "window", "partitionby": ["group"], "ops": ["sum"], "fields": ["field"], "as": ["group_total"] }, { "type": "pie", "field": "field", "groupby": ["group"] } ] } ], "scales": [ { "name": "color", "type": "ordinal", "domain": {"data": "table", "field": "id"}, "range": {"scheme": "category20"} } ], "marks": [ { "type": "arc", "from": {"data": "table"}, "encode": { "enter": { "startAngle": {"field": "startAngle"}, "endAngle": {"field": "endAngle"}, "fill": {"scale": "color", "field": "id"}, "outerRadius": {"value": 50}, "x": {"signal": "datum.group === 1 ? width/4 : width*3/4"}, "y": {"signal": "height / 2"}, "opacity": {"value": 0.8} } } } ] }
代码说明
- window变换:按
group分组计算每组的field总和,确保每个饼图的扇区占比基于组内数据,而非全部数据 - pie变换的groupby:指定
group为分组字段,Vega会自动为每个组单独计算饼图角度 - 饼图位置控制:通过
signal根据group值设置不同的x坐标,实现两个饼图的分离展示,后续可将此处替换为网络图布局输出的节点x/y坐标
内容的提问来源于stack exchange,提问作者sabine
相关产品推荐
相关产品推荐

