Matlab如何平移图形(Figure)中的曲线

0. 原由

Matlab绘制出图形(Figure)后,分析数据时经常需要平移曲线,便于定量比较曲线的特征,如下图,需要平移曲线使得三条曲线重合。

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

曲线移动动画效果

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

演示效果:

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

演示效果:

4. 推荐

平移操作完成后,Figure图形中曲线的数据发生了变化,此时希望获取图形原始数据时,可使用Fun_GetFigData函数,详见Matlab如何提取fig文件中的数据

% XYZdata为提取的图形数据
XYZdata = Fun_GetFigData( hf );  % hf为fig文件句柄或文件名

精确的曲线平移前提是获取准确的平移坐标dx和dy,可使用差值光标获取Figure图形曲线的特征点和平移坐标dx、dy,效果如下,详见Matlab图形(Figure)中使用差值光标

源程序下载

有Matlab/Simulink方面的技术问题,欢迎发送邮件至944077462@qq.com讨论。更多Matlab/Simulink原创资料,欢迎关注微信公众号:Matlab Fans

Matlab如何平移图形(Figure)中的曲线
在这里插入图片描述

  • 11
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatlabFans_Mfun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值