3

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

3 回答 3

8

最简单的解决方案是在注释中添加特定标签。

%# 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'))
于 2012-08-08T13:44:28.330 回答
1

我还发现这findobj在这里不起作用。注释的父级似乎是一个 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它。

MathWorks,您可以做得比这更好!

于 2017-03-12T07:28:15.453 回答
0

您应该看一下findobj函数。只要您知道要查找的对象的足够属性,就应该能够使用它返回句柄(如果您尚未将其保存到变量中)并以这种方式删除它。

于 2012-08-07T11:38:28.940 回答