MATLAB绘图中如何裁剪部分数据 实现点击坐标点按x轴截断
双点交互按X轴裁剪MATLAB绘图数据的实现
原代码存在的可优化问题
- 语句
x = output, output1;存在语法歧义,MATLAB会将逗号后的内容作为独立语句解析,实际赋值结果仅为output,后续y轴变量与x轴未建立一一对应的索引关联 - 原逻辑仅支持单点位裁剪,未实现双点选择区间裁剪的交互能力
- 原代码仅对x数组做元素删除,未同步匹配删除同索引下的y值,容易触发x/y维度不匹配的绘图报错
适配双点裁剪需求的修正代码
load sample.mat X = sample.current; X1 = sample.voltage; Ts = 0.01; Fs = 1/Ts; Fc = 2; N = 10; d = fdesign.lowpass('N,Fc', N, Fc, Fs); Hd = design(d); output = filter(Hd, X); output1 = filter(Hd, X1); figure; plot(X, X1, '-g'); hold on plot(output, output1, 'r'); hold off legend('raw signal','filtered signal') grid on % 修正x/y变量的绑定关系 x_data = output; y_data = output1; figure subplot(2,1,1) plot(x_data, y_data, 'r'); title('Original plot'); uiwait(msgbox('请依次点击两个X轴位置,将保留两点之间的数据段','modal')); % 捕获两个点击点的坐标 [click_x, ~] = ginput(2); % 自动排序两个点击位置,适配用户点击顺序不固定的场景 x_crop_min = min(click_x); x_crop_max = max(click_x); % 通过索引掩码同步筛选x/y数组的对应元素 keep_idx = x_data >= x_crop_min & x_data <= x_crop_max; x_cropped = x_data(keep_idx); y_cropped = y_data(keep_idx); subplot(2,1,2); plot(x_cropped, y_cropped, 'r'); title('New plot with cropped values'); xlim([min(x_cropped(:)) max(x_cropped(:))]);
逻辑调整说明
- 交互流程运行时会弹出模态提示框,用户依次点击两个坐标轴位置即可完成选择,程序不要求用户必须先点左侧再点右侧,会自动识别两个点构成的X轴范围
- 裁剪操作通过索引映射同步作用于x、y两个数组,从根源避免维度不匹配的绘图报错
- 如果需要实现裁掉两个点外侧所有数据的效果,只需将筛选条件替换为
keep_idx = x_data < x_crop_min | x_data > x_crop_max即可保留区间外的全部数据
内容的提问来源于stack exchange,提问作者HK2
相关产品推荐
相关产品推荐

