我需要使用MATLAB指南实时绘制相同轴上的2个变量。现在我正在成功地为每个子图绘制1个变量。
为了做到这一点,我在_OpeningFcn中创建了一个计时器和2个handle.plot:
handles.timer = timer(...
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly
'Period', 1, ... % Initial period is 1 sec.
'TimerFcn', {@update_display,hObject}); % Specify callback function
handles.subplot=subplot(2,1,1,'Parent',handles.uipanel3);
handles.subplot1=subplot(2,1,2,'Parent',handles.uipanel3);
handles.plot = plot(handles.subplot,0,0,'b');
handles.plot1 = plot(handles.subplot1,0,0,'r');
然后,在函数update_display中,我将最后的值与之前的值连接起来,如下所示:
x = get(handles.plot,'XData');
x = [x, x(length(x))+1]; % (time=1sec)
y = get(handles.plot,'YData');
y = [y, yf]; % A/D value = yf
set(handles.plot,'XData',x);
set(handles.plot,'YData',y);
e = get(handles.plot1,'YData');
e = [e, error];
set(handles.plot1,'XData',x);
set(handles.plot1,'YData',e);
我想要做的是在同一个图中绘制这两个变量。我想也许我应该使用之前的handle.plot_parent更改handle.subplot和'Parent'handle.uipanel3,但是我遇到了麻烦,因为我不确定它预期的参数。
感谢您的任何建议。
答案 0 :(得分:2)
最好的开始可能是清除情节/子情节/轴/图等之间的混淆......
figure
是一个“窗口”。使用类似命名的命令figure
创建的图形对象。axes
也是图形对象。它是一个容器,它可以包含各种其他低级图形对象,如lines
,surfaces
,patches
等...
它可以包含多个类型的多个子对象。它可以使用命令axes
创建,也可以使用subplot
创建。 subplot
的特殊性在于它允许您轻松地将多个axes
放在一个图中。如果您只打算在图中创建一个axes
,则无需调用子图,您可以直接调用axes
。line
是基本的线条图形对象。可以修改属性以显示连续线(具有不同样式),带或不带标记,或甚至仅标记,不必通过线“连接”。命令plot
确实创建了一个line
对象,其中包含您在输入中提供的参数。清理完毕后,让我们解决您的问题:
根据您的评论,我了解您想要所有情节(您的lines
),在同一个“子情节”中(例如:在同一个axes
中)。
你几乎就在那里,你只需要在你的开场函数中定义一个axes
,然后修改这个axes
的属性,这样它就可以接受多行(默认情况下每个新行都会删除现有的)。之后,就像你一样初始化你的行,然后在更新函数中更新它们。
所以在实践中:
将计时器定义下的代码替换为:
handles.axe = axes('Parent',handles.uipanel3,'NextPlot','Add'); %// c reate an "axes" object which can accept multiple plots
handles.plot0 = plot( handles.axe , 0,0 , 'b' ); %// create empty line in the axes "handles.axe"
handles.plot1 = plot( handles.axe , 0,0 , 'r' ); %// create empty line in the axes "handles.axe"
然后在你的更新功能中:
%// update your first line
y = get(handles.plot0,'YData');
y = [y, yf]; %// A/D value = yf
x = 0:numel(y)-1 ; %// This will create a vector [0 1 2 3 ...] the same size as "y"
set(handles.plot0,'XData',x , 'YData',y ); %// you can set both XData and YData in the same instruction
%// update your second line
e = [ get(handles.plot1,'YData') error ] ; %// you can concatenate the new value directly with the old data
set(handles.plot1,'XData',x ,'YData',e );
我冒昧地改变了你的更新功能,只是为了向你展示其他一些做事方式。如果你想坚持下去,你的初始方式应该可以正常工作。真正的诀窍是在同一个axes
对象中创建2条初始行。