MATLAB - 如何在GUI中更新绘图?

4

我是一名有用的助手,可以为您提供文本翻译。

开始使用matlab指南时,遇到了一个障碍。我把它做成了一个简单的玩具gui来说明我的问题。一个名为asas的gui有一个按钮和一个轴。按钮的回调函数读取

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没有替换要绘制的数据,而是尝试追加到图中?
我已经搜索过了,但没有找到适用的内容。

这段代码是否有效,即 x=rand(randi(10+20,1),4); plot(x)? - Dan
谢谢Dan的快速回复。是的,它有效!我以为我总是需要指定绘图位置——这表明我的无知,我猜。请问有人能指出我原来的代码哪里出了问题吗?(Dan或其他人) - pedro silva
我猜之前的方式没有清除图表。最好保持与之前相似的方式,只是在重新绘制之前手动清除图表,但我对此不是100%确定。 - Dan
关于替换旧图,您是否可以在按钮按下时简单地实现 clf,这样它就会始终尝试在一个干净的图上绘制。 - gkiar
1个回答

8

如果你是MATLAB及其句柄图形子系统的新手,那么解释可能不是很直观。

以下是你的代码逐行解释:

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

第一行试图在当前图形(gcf,“获取当前图形”)中查找任何具有属性'Tag'设置为字符串'axes1'的子对象。我猜你知道这个吧?第二行当然生成一些随机数据来绘制。第三行将数据绘制在x中。
但是,在plot调用之后,属性'Tag'实际上被重置为''(空字符串),这反过来使得findobj在任何后续搜索轴句柄时都失败。因此,变量axesHandle不包含实际的句柄,而是空矩阵[]。这将使绘图默认为另一种模式,并将空矩阵解释为x轴的数据(plot的第一个参数)。这预期会导致您收到的错误。
...
Error using plot Vectors must be the same lengths.
...
以上评论中Dan提供的解决方案是一个变通方法,但是在GUI中告诉plot应该在哪里绘制才是更好的选择。
你可以添加第四行代码:
set(axesHandle,'Tag','axes1');

这将把属性'Tag'设置回'axes1',随后的按钮点击也应该可以正常工作。现在您可以添加多个坐标轴对象,如果这正是您所需的话。

再次感谢所有回复的人,特别是Ole美化我的问题并提供了长而有启发性的答案。如果我足够“有声望”,我肯定会加分给你的答案(尽管我可能也会在第一行中将“it's”更改为“its”)。我完全不知道在绘图调用之后,“Tag”属性会被重置为空字符串。我已经采用了您的“第四行”解决方案,并且它起作用了。 - pedro silva
现在你应该能够投票了 :P 我很高兴它起作用了。如果它解决了你的问题,请也接受这个答案。 - Ole Thomsen Buus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接