从图中删除注释

时间:2012-08-07 07:32:51

标签: matlab annotations

我有一个包含情节的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');

3 个答案:

答案 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功能有所了解。只要您知道要查找的对象的足够属性,就应该能够使用此方法返回句柄(如果您还没有将其保存到变量中)并以此方式删除它。