Matlab子图关联不同数据源实现跨图选中高亮且保留原始绘图的方法
解决方案
核心思路
放弃使用兼容性较差的linkdata功能,改用Matlab内置的brush选点工具搭配自定义回调函数实现同步高亮,全程不会修改原有绘图样式,同时适配通用函数封装需求。
完整实现代码
function linkedPlot(lat, lon, x, y) close all % 若需测试可取消下方注释,调用时不用传参即可运行 % t = linspace(-2,2,100); % lat = sin(t); % lon = cos(t); % x = t; % y = exp(t); figure() % 绘制第一个子图并保留绘图句柄 subplot(1,2,1) h1 = plot(lat, lon, '-x'); xlabel('纬度') ylabel('经度') title('经纬度轨迹') % 绘制第二个子图并保留绘图句柄 subplot(1,2,2) h2 = plot(x, y, '-x'); xlabel('时间戳') ylabel('速度') title('速度时序') % 初始化brush工具 br = brush; br.Enable = 'on'; % 设置选中高亮样式,可按需调整 br.Color = 'r'; br.Style = 'filled'; % 给两个子图绑定选点后触发的回调函数 set(h1, 'ButtonDownFcn', {@syncSelect, h1, h2}); set(h2, 'ButtonDownFcn', {@syncSelect, h2, h1}); % 全局绑定brush的选后回调,保证框选也能同步 set(br, 'PostSelectionCallback', {@syncBrushSelect, h1, h2}); end % 点选同步回调 function syncSelect(~, ~, src_h, target_h) br = brush(gcf); % 获取当前选中的点索引 selected = logical(get(src_h, 'Selected')); % 同步给目标绘图对象 set(target_h, 'Selected', selected); end % 框选同步回调 function syncBrushSelect(~, ~, h1, h2) selected1 = logical(get(h1, 'Selected')); selected2 = logical(get(h2, 'Selected')); % 双向同步选中状态 if any(selected1) set(h2, 'Selected', selected1); elseif any(selected2) set(h1, 'Selected', selected2); end end
代码说明
- 原有绘图的线型、标记、颜色等样式完全保留,不会出现linkdata导致的样式异常问题
- 同时支持单点点击选中、框选两种操作,选中一侧子图的任意点,另一侧子图相同索引的点会同步高亮
- 函数已经预留了输入参数接口,直接传入你的
lat、lon、x(即时间戳t)、y(即速度数据)即可使用,不需要修改内部逻辑。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

