Vega树形图的Pan与Zoom功能实现需求
Vega树形图平移与缩放实现方案
以下是为你的树形图添加Pan(平移)和Zoom(缩放)功能的修改代码,核心通过信号控制变换参数,将所有图表元素纳入分组容器统一应用交互效果:
{ "$schema": "https://vega.github.io/schema/vega/v5.json", "signals": [ { "name": "scale", "value": 1, "on": [ { "events": {"type": "wheel", "consume": true}, "update": "clamp(scale * (1 + event.deltaY * -0.001), 0.25, 4)" } ] }, { "name": "translateX", "value": 0, "on": [ { "events": "mousedown", "update": "translateX" }, { "events": "[mousedown, window:mousemove] > window:mouseup", "update": "translateX + (event.x - event.x0)" } ] }, { "name": "translateY", "value": 0, "on": [ { "events": "mousedown", "update": "translateY" }, { "events": "[mousedown, window:mousemove] > window:mouseup", "update": "translateY + (event.y - event.y0)" } ] }, { "name": "isDragging", "value": false, "on": [ { "events": "mousedown", "update": "true" }, { "events": "window:mouseup", "update": "false" } ] }, { "name": "cursor", "value": "default", "on": [ { "events": {"signal": "isDragging"}, "update": "isDragging ? 'move' : 'default'" } ] } ], "data": [ { "name": "default", "transform": [{ "type": "nest", "generate": true, "keys": ["$dimension1"] }, { "type": "tree", "method": "tidy", "size": [{"signal": "height"}, {"signal": "width - 20"}], "separation": true, "as": ["y", "x", "depth", "children"] } ] }, { "name": "links", "source": "default", "transform": [ { "type": "treelinks" }, { "type": "linkpath", "orient": "horizontal", "shape": "diagonal" } ] } ], "scales": [ { "name": "color", "type": "ordinal", "domain": {"data": "default", "field": "depth"}, "range": {"scheme": "datastudio20"} } ], "marks": [ { "type": "group", "encode": { "update": { "cursor": {"signal": "cursor"} } }, "transform": [ {"type": "translate", "x": {"signal": "translateX"}, "y": {"signal": "translateY"}}, {"type": "scale", "x": {"signal": "scale"}, "y": {"signal": "scale"}} ], "marks": [ { "type": "path", "from": {"data": "links"}, "encode": { "update": { "path": {"field": "path"}, "stroke": {"value": "#ccc"} } } }, { "type": "symbol", "from": {"data": "default"}, "encode": { "enter": { "size": {"value": 100}, "stroke": {"value": "#fff"} }, "update": { "x": {"field": "x"}, "y": {"field": "y"}, "fill": {"scale": "color", "field": "depth"} } } }, { "type": "text", "from": {"data": "default"}, "encode": { "enter": { "text": {"signal":"datum.$dimension0 || datum.key || 'Customer'"}, "fontSize": {"value": 12}, "baseline": {"value": "middle"} }, "update": { "x": {"field": "x"}, "y": {"field": "y"}, "dx": {"signal": "datum.children ? -7 : 7"}, "align": {"signal": "datum.children ? 'right' : 'left'"}, "opacity": 1 } } } ] } ] }
功能说明
- 缩放控制:鼠标滚轮调整视图大小,缩放范围限制在0.25-4倍,避免内容过度失真
- 平移操作:按住鼠标左键拖拽,可自由移动视图位置
- 交互反馈:拖拽时鼠标光标切换为移动样式,提升操作感知
内容的提问来源于stack exchange,提问作者EmperorNero
相关产品推荐
相关产品推荐

