4

matlab 入门指南,遇到了一个绊脚石。把它当作玩具 gui 来说明我的问题一样简单。gui(名为 asas)有一个按钮和一个轴。按钮的回调读取

axesHandle= findobj(gcf,'Tag','axes1');
x=rand(randi(10+20,1),4);
plot(axesHandle, x)

我没有编写其他代码(指南编写了它)。
我第一次按下按钮时,一切都很好:情节完成了。第二次,我从控制台收到一个错误:

Error using plot
Vectors must be the same lengths.

Error in asas>pushbutton1_Callback (line 83)
plot(axesHandle, x)

Error in gui_mainfcn (line 96)
        feval(varargin{:});
etc...

我想绘制新数据 x,替换旧数据。
看起来 matlab 并没有替换要绘制的数据,而是以某种方式试图附加到绘图中?

我已经搜索过,但没有找到任何适用的内容。

4

1 回答 1

8

解释并不简单——如果您是 MATLAB 及其句柄图形子系统的新手,当然也不会。

您的代码原样,逐行:

axesHandle= findobj(gcf,'Tag','axes1');
x=rand(randi(10+20,1),4);
plot(axesHandle, x);

第一行尝试在当前图形(“获取当前图形”)中定位属性设置为字符串gcf的任何子对象。我想你知道这件事吗?第二行当然会生成一些要绘制的随机数据。第三行将数据绘制在.'Tag''axes1'x

但是在plot-call 之后,该属性'Tag'实际上被重置为''(空字符串),这反过来又会findobj在任何后续的轴句柄搜索中失败。因此,变量axesHandle不包含实际句柄,而是空矩阵[]。这将使绘图默认为另一种模式,将空矩阵解释为 x 轴的数据(的第一个参数plot)。这预计会导致您收到错误:

...
Error using plot Vectors must be the same lengths.
...

Dan 在上面的评论中的解决方案是一种解决方法,但是告诉plot在哪里绘图是很有意义的——尤其是在 GUI 中。

您可以改为添加第四行:

set(axesHandle,'Tag','axes1');

这会将属性设置'Tag'回,'axes1'并且按钮上的任何后续单击现在也应该起作用。您现在可以添加多个轴对象。如果那是你想要的。

于 2012-07-09T17:23:15.977 回答