如何在Deneb(Vega/Vega-Lite)中绘制x、y分别升序的散点图
Deneb(Vega-Lite)实现x/y各自排序后的散点图
要实现x、y各自升序排序后再绘制(断开原数据关联),可以通过Vega-Lite的**数据转换(transform)**来拆分、排序并重新合并数据集,具体代码如下:
{ "data": { "values": [ {"x": "1", "y": "3.2"}, {"x": "2", "y": "1.9"}, {"x": "4", "y": "2.1"}, {"x": "3", "y": "4.5"}, {"x": "6", "y": "5.1"}, {"x": "5", "y": "8.5"}, {"x": "7", "y": "6"}, {"x": "8", "y": "7.9"}, {"x": "9", "y": "9.1"}, {"x": "10", "y": "11"} ] }, "transform": [ // 提取所有x值,转定量类型后升序排序,添加索引用于后续合并 { "fold": ["x"], "as": ["key", "x_val"] }, { "calculate": "parseFloat(datum.x_val)", "as": "x_num" }, { "sort": [{"field": "x_num", "order": "ascending"}], "window": [{"op": "row_number", "as": "index"}] }, {"project": ["index", "x_num"]}, // 提取所有y值,转定量类型后升序排序,添加索引并与x数据集合并 { "lookup": "index", "from": { "data": {"values": [ {"x": "1", "y": "3.2"}, {"x": "2", "y": "1.9"}, {"x": "4", "y": "2.1"}, {"x": "3", "y": "4.5"}, {"x": "6", "y": "5.1"}, {"x": "5", "y": "8.5"}, {"x": "7", "y": "6"}, {"x": "8", "y": "7.9"}, {"x": "9", "y": "9.1"}, {"x": "10", "y": "11"} ]}, "transform": [ {"fold": ["y"], "as": ["key", "y_val"]}, {"calculate": "parseFloat(datum.y_val)", "as": "y_num"}, {"sort": [{"field": "y_num", "order": "ascending"}], "window": [{"op": "row_number", "as": "index"}]}, {"project": ["index", "y_num"]} ] }, "as": ["y_index", "y_num"] }, // 移除多余字段,保留最终可用数据 {"project": ["x_num", "y_num"]} ], "mark": {"type": "line", "point": true}, "encoding": { "x": {"field": "x_num", "type": "quantitative", "title": "排序后的X"}, "y": {"field": "y_num", "type": "quantitative", "title": "排序后的Y"} } }
关键转换步骤说明:
- 折叠(fold)字段:将x、y从对象结构转为列表形式,实现单独处理
- 类型转换:原数据中x、y为字符串格式,用
parseFloat转为数值类型,确保排序逻辑生效 - 窗口函数(window):为排序后的x、y分别添加行号索引,保证后续能按索引一一对应合并
- 查找合并(lookup):通过索引字段将排序后的x、y数据集合并,得到x、y各自升序且无原关联的新数据
内容的提问来源于stack exchange,提问作者AMGFREO
相关产品推荐
相关产品推荐

