如何在matlab图中滑动绘图线

时间:2019-02-28 11:01:37

标签: matlab matlab-figure

我正在使用以下代码绘制正弦和余弦:

x = 0 : 0.1 : 2*pi ;
y1 = sin (x) ;
y2 = cos (x) ;
figure ;
plot(x,y1) ;
hold ;
plot(x,y2,'r')

我想移动/滑动与sin相对应的线,以便覆盖与cos相对应的线的顶部,并希望在不移动平移的情况下实现它。我搜索了ob web,但找不到简单的解决方案。

2 个答案:

答案 0 :(得分:3)

您可以在函数中绘制2个窦/余弦,然后使用回调来更新您的图,这里我在回调函数call_S中更新窦图的相位:

function [] = slider_plot()
  % Plot different plots according to slider location.
  S.fh = figure('position',[300 300 300 300],....
                'resize','off');    
  S.x = 0:.01:4*pi;  %range.         
  S.ax = axes('unit','pix',...
              'position',[20 80 260 210]);
  S.sin = plot(S.x,sin(S.x),'r'); %sinus phase will move
  hold on
  S.cos = plot(S.x,cos(S.x),'b');       
  S.sl = uicontrol('style','slide',...
                   'position',[20 10 260 30],...
                   'min',0,'max',3*pi/2,'val',0,... %default phase = 0
                   'sliderstep',[0.1 0.1],...
                   'callback',{@call_S,S});  
function [] = call_S(varargin)
  % Callback for the phase slider.
  [h,S] = varargin{[1,3]};  % calling handle and data structure.
  set(S.sin,'ydata',sin(S.x + get(h,'value'))) %set the new phase

在这种情况下,我使用滑块,但是您也可以使用鼠标的位置来确定新的阶段。

结果:

enter image description here

您可以移动滑块以移动相位:

enter image description here

答案 1 :(得分:0)

非常感谢@obchardon:

下面是他的代码的更新版本,符合我的要求:

function [] = slider_plot2()
x = 0 : 0.1 : 4*pi ;
y1 = sin (x) ;
y2 = cos (x) ;
  % Plot different plots according to slider location.
  S.fh = figure('position',[300 300 500 500],....
                'resize','off');    
  S.x = x;  %range.   
  S.y2 = y2  ;
  S.ax = axes('unit','pix',...
              'position',[30 80 460 410]);
  S.line2 = plot(S.x,y2,'r'); %sinus phase will move
  hold on
  S.line1 = plot(S.x,y1,'b');       
  S.sl = uicontrol('style','slide',...
                   'position',[20 10 260 30],...
                   'min',1,'max',length(x),'val',1,... %default phase = 0
                   'sliderstep',[1 1],...
                   'callback',{@call_S,S});  
function [] = call_S(varargin)
  % Callback for the phase slider.
  [h,S] = varargin{[1,3]};  % calling handle and data structure.
  currentPosition = floor(get(h,'value'))  ;
  ydata = S.y2(currentPosition:end) ;
  xdata = S.x(1:end-currentPosition+1)  ;
 set(S.line2,'xdata',xdata,'ydata',ydata) %set the new phase
 %set( S.line2,'ydata',ydata) %set the new phase