如何禁用Plotly.js双击标记放大功能并保留双击缩小重置特性
问题解答
这个需求可以实现,且不需要修改Plotly源码,根据使用场景有两种对应实现方案:
方式1:配置项直接实现(适配你当前的代码场景)
你给出的示例代码已经在layout中提前定义了xaxis.range和yaxis.range作为初始视图范围,这种场景下只需要在调用Plotly.newPlot时传入配置参数,将doubleClick属性设置为'reset'即可。
该配置的效果是:任何时候双击图表,都会直接重置回你在layout里预先定义的初始坐标轴范围,不会触发默认的自动适配标记放大行为,完全满足保留双击重置、禁用双击放大的要求。
修改后的完整代码如下:
var trace1 = { x: [1, 2, 3, 4, 5], y: [1, 6, 3, 6, 1], mode: 'markers', type: 'scatter', name: 'Team A', text: ['A-1', 'A-2', 'A-3', 'A-4', 'A-5'], marker: { size: 12 } }; var trace2 = { x: [1.5, 2.5, 3.5, 4.5, 5.5], y: [4, 1, 7, 1, 4], mode: 'markers', type: 'scatter', name: 'Team B', text: ['B-a', 'B-b', 'B-c', 'B-d', 'B-e'], marker: { size: 12 } }; var data = [ trace1, trace2 ]; var layout = { xaxis: { range: [ 0.75, 5.25 ] }, yaxis: { range: [0, 8] }, title:'Data Labels Hover' }; // 新增双击行为配置 var config = { doubleClick: 'reset' }; // 传入配置参数初始化图表 Plotly.newPlot('myDiv', data, layout, config);
方式2:事件监听实现(适配初始范围自动计算的场景)
如果你的图表初始没有写死坐标轴范围,是Plotly首次渲染时自动计算的适配范围,可以通过监听双击事件、判断当前视图状态的方式实现需求,核心逻辑:
- 图表首次渲染完成后,记录当前自动计算的坐标轴初始范围
- 禁用默认的双击行为,绑定自定义双击监听逻辑
- 双击触发时判断当前坐标轴范围是否和初始范围一致:如果一致则不执行任何操作(拦截默认放大),如果不一致则重置回初始范围(保留双击重置特性)
参考代码片段:
// 执行初始渲染 Plotly.newPlot('myDiv', data, layout).then(gd => { // 渲染完成后记录初始轴范围 const initialRange = { xaxis: [...gd.layout.xaxis.range], yaxis: [...gd.layout.yaxis.range] }; // 禁用默认双击行为 gd._context.doubleClick = false; // 绑定自定义双击逻辑 gd.on('plotly_doubleclick', () => { const currentXRange = gd.layout.xaxis.range; const currentYRange = gd.layout.yaxis.range; // 判断当前是否处于初始视图 const isAtInitialView = currentXRange[0] === initialRange.xaxis[0] && currentXRange[1] === initialRange.xaxis[1] && currentYRange[0] === initialRange.yaxis[0] && currentYRange[1] === initialRange.yaxis[1]; // 非初始视图下执行重置 if (!isAtInitialView) { Plotly.relayout(gd, initialRange); } }) })
补充说明
doubleClick配置项的可选值及对应行为:
'reset+autosize':默认值,当前处于初始视图时双击会自动放大适配所有数据标记,当前处于放大/平移后的视图时双击重置回初始范围'reset':双击永远重置回预设/渲染完成时的初始轴范围,不会触发自动放大逻辑'autosize':双击永远执行自动适配所有标记的放大操作false:完全禁用所有双击相关行为
内容的提问来源于stack exchange,提问作者Williams86
相关产品推荐
相关产品推荐

