0. 原由
Matlab绘制出图形(Figure)后,分析数据时经常需要平移曲线,便于定量比较曲线的特征,如下图,需要平移曲线使得三条曲线重合。
![](https://i-blog.csdnimg.cn/blog_migrate/257f47b5010139aa0da06e0082789638.jpeg)
Matlab的Figure工具栏中没有提供曲线平移的工具,平移曲线只能先对原始数据进行运算,然后重新绘图,不便于可视化操作。笔者尝试开发了用于Matlab图形(Figure)中进行曲线平移的代码,能够与Matlab的自带Figure无缝对接,推荐作为Figure图形编辑的小工具。
1. 方法
移动图形(Figure)曲线的方法:
- 1) 获取曲线数据的xdata和ydata;
% hl为曲线句柄
x = get(hl,'xdata'); % x坐标
y = get(hl,'ydata'); % y坐标
- 2) 根据平移量计算平移后曲线数据的xdata和ydata;
x_new = x + dx; % x坐标平移dx
y_new = y + dy; % y坐标平移dy
- 3) 改变曲线数据的xdata和ydata。
set(hl,'xdata',x_new); % x坐标
set(hl,'ydata',y_new); % y坐标
可视化操作的方法:
鼠标点击操作:向Figure增加鼠标点击回调函数,用户第一次点击鼠标时进入平移曲线编辑模式,第二次点击鼠标时选中带平移的曲线,第三次点击鼠标时确认曲线移动位置,第四次点击鼠标退出编辑模式。
set(hf,'WindowButtonDownFcn' ,@LineMove_WindowButtonDownFcn); % 鼠标点击回调函数
鼠标移动操作:向Figure增加鼠标移动回调函数,曲线选中前,移动鼠标时在曲线上获取捕捉点;曲线选中后,移动鼠标时平移曲线。
set(hf,'WindowButtonMotionFcn' ,@LineMove_WindowButtonMotionFcn); % 鼠标移动回调函数
键盘操作:向Figure增加键盘方向键和回车键按下回调函数,当用户按上下左右方向键时能够移动选定曲线(相当于鼠标移动),按下回车键时确认选中或移动操作(相当于鼠标点击),键盘操作能够更加精准移动到。
set(hf,'WindowKeyPressFcn' ,@LineMove_WindowKeyPressFcn); % 键盘按下回调函数
2. 函数
在图形绘制完成后,输入LineMove指令,即可直接在图形Figure中进行曲线移动操作。
function LineMove()
% LineMove figure图形中平移曲线函数
clear global hp hp2 hl f hs % 清除全局变量
global hp hp2 hl f hs
hf = gcf;
if isempty(f)
f = 0; % 初始化 f = 0
end
set(hf,'WindowButtonDownFcn' ,@LineMove_WindowButtonDownFcn); % 鼠标点击回调函数
set(hf,'WindowButtonMotionFcn' ,@LineMove_WindowButtonMotionFcn); % 鼠标移动回调函数
set(hf,'WindowKeyPressFcn' ,@LineMove_WindowKeyPressFcn); % 键盘按下回调函数
end
3. 演示
3.1 已知平移坐标时
%% Test 1 已知移动距离时
close all
clear
clc
t = linspace(0,4*pi,500);
x = sin(t);
y = sin(t+pi/3);
z = sin(t+pi/2) - 0.5;
figure
hold on
hl1 = plot(t,x);
hl2 = plot(t,y,'r--');
hl3 = plot(t,z,'b-.');
xlabel('时间/s')
ylabel('幅值')
ylim([-2 2])
Fun_LineMove(hl2,pi/3,0) % 曲线2 x方向移动pi/3
Fun_LineMove(hl3,pi/2,0.5) % 曲线3 x方向移动pi/2 y方向移动0.5
曲线移动动画效果:
![](https://i-blog.csdnimg.cn/blog_migrate/85fd4a1806e9410cfb5ecb327ecd24ba.gif)
3.2 鼠标操作曲线移动
close all
clear
clc
t = linspace(0,4*pi,500);
x = sin(t);
y = sin(t+pi/3);
z = sin(t+pi/2) - 0.5;
figure
hold on
hl1 = plot(t,x);
hl2 = plot(t,y,'r--');
hl3 = plot(t,z,'b-.');
xlabel('时间/s')
ylabel('幅值')
LineMove
演示效果:
![](https://i-blog.csdnimg.cn/blog_migrate/f45cf32c5773fc6c5cc048d6238215c7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/23282dfa473d55ec96a7323e0cdd2043.jpeg)
3.3 鼠标+键盘移动操作曲线移动
close all
clear
clc
t = linspace(0,4*pi,500);
x = sin(t);
y = sin(t+pi/3);
z = sin(t+pi/2) - 0.5;
figure
hold on
hl1 = plot(t,x);
hl2 = plot(t,y,'r--');
hl3 = plot(t,z,'b-.');
xlabel('时间/s')
ylabel('幅值')
LineMove
演示效果:
![](https://pic4.zhimg.com/v2-105716a263e29f6bcd61c8ee57cb9d9f_b.gif)
4. 推荐
平移操作完成后,Figure图形中曲线的数据发生了变化,此时希望获取图形原始数据时,可使用Fun_GetFigData函数,详见Matlab如何提取fig文件中的数据。
% XYZdata为提取的图形数据
XYZdata = Fun_GetFigData( hf ); % hf为fig文件句柄或文件名
精确的曲线平移前提是获取准确的平移坐标dx和dy,可使用差值光标获取Figure图形曲线的特征点和平移坐标dx、dy,效果如下,详见Matlab图形(Figure)中使用差值光标。
![](https://i-blog.csdnimg.cn/blog_migrate/5be9d4e99e4d18762bfc9380d40c38e7.gif)
源程序下载
有Matlab/Simulink方面的技术问题,欢迎发送邮件至944077462@qq.com讨论。更多Matlab/Simulink原创资料,欢迎关注微信公众号:Matlab Fans