我有一个包含情节的gui。在这个图中我添加了一个注释。当使用gui更改绘图数据时,旧的注释仍然存在,新的注释将绘制在旧的上面。
所以我需要删除他的旧注释。 我尝试了以下代码,但这没有效果:
set(0,'showhiddenhandles','on')
% look for all axes in the figure of choice:
h_all_axes = findall(gcf,'type','axes');
% get the 'annotation layer' axes handle:
h_anno_axes = double(find(handle(h_all_axes),'-class','graph2d.annotationlayer'));
delete(h_anno_axes);
set(0,'showhiddenhandles','off');
annotationPos = [0.55 0.58 0.6 0.3];
htxtbox = annotation('textbox',annotationPos, ...
'String' ,strtextbox, ...
'FontSize' ,FontSize+1, ...
'FitBoxToText', 'on', ...
'EdgeColor', 'none', ...
'FontName' , 'Courier New');
答案 0 :(得分:7)
最简单的解决方案是在注释中添加特定标记。
%# create the annotation
annotationPos = [0.55 0.58 0.6 0.3];
htxtbox = annotation('textbox',annotationPos, ...
'String' ,strtextbox, ...
'FontSize' ,FontSize+1, ...
'FitBoxToText', 'on', ...
'EdgeColor', 'none', ...
'FontName' , 'Courier New', ...
'Tag' , 'somethingUnique');
%# delete the annotation
delete(findall(gcf,'Tag','somethingUnique'))
答案 1 :(得分:1)
我还发现findobj
在这里不起作用。注释的Parent似乎是一个AnnotationPane,据我所知,每个图只有一个,就像一个覆盖在图上的透明表,一个人写的。
- 如果你clf
,它会被清除。
- 如果你cla
,则不会。
我发现了这一点,因为在我的应用程序中我有用户可以旋转的3D轴,我希望用户的首选视点和屏幕上的图形窗口大小,从一次运行到接下来,需要cla
而不是clf
。但我发现注释(从运行到运行的变化)只是在图上积累了。然而,这对我有用:
% This eccentric method removes any existing annotations, since they
% lie around on the Figure; cla didn't remove them. htemp.Parent is
% 'the' AnnotationPane.
htemp = annotation('textbox','Position',[0 0 0 0]);
delete(htemp.Parent.Children);
说明:AnnotationPane似乎不是通常的图形对象集的一部分,所以我"得到了"它通过创建一个虚拟注释并访问其父。现有注释存储在数组htemp.Parent.Children
中(您可以使用它来列出它们),因此delete
可以使用它。
MatheWorks,你可以做得更好!
答案 2 :(得分:0)
你应该对findobj功能有所了解。只要您知道要查找的对象的足够属性,就应该能够使用此方法返回句柄(如果您还没有将其保存到变量中)并以此方式删除它。