在MATLAB中重新打印已删除的对象
是否可以使用“get()”以前检索到的属性在删除行后重新打印该行 例如:在MATLAB中重新打印已删除的对象,matlab,graphics,matlab-figure,Matlab,Graphics,Matlab Figure,是否可以使用“get()”以前检索到的属性在删除行后重新打印该行 例如: % Create the plot and 'get' its properties. axes P = plot(1:360, sind(1:360)); PG = get(P); % Delete the plot. delete(P) % Replot the line... plot(PG) % ????? 我希望它是可推广的,即解决方案适用于曲面图、线条图、文本注释等。方法1:不要删除它,使其不可见 您可
% Create the plot and 'get' its properties.
axes
P = plot(1:360, sind(1:360));
PG = get(P);
% Delete the plot.
delete(P)
% Replot the line...
plot(PG) % ?????
我希望它是可推广的,即解决方案适用于曲面图、线条图、文本注释等。方法1:不要删除它,使其不可见
您可以使对象不可见,而不是删除和重新创建对象:
set(P, 'visible', 'off')
然后再次可见
set(P, 'visible', 'on')
方法2:使用循环创建对象并设置属性值
如果确实要重新创建已删除的对象,可以按如下操作:创建相同类型的对象,并使用for
循环将其属性设置为存储的值。需要一个块,因为某些属性是只读的,并且会发出错误
%// Replot the object...
Q = plot(NaN); %// create object. Plot any value
fields = fieldnames(PG);
for n = 1:numel(fields)
try
set(Q, fields{n}, getfield(PG, fields{n})); %// set field
catch
end
end
您可以将此方法用于其他类型的图形对象,例如surf
,但随后必须更改创建对象的行(上面代码中的第一行)。例如,使用surf
时
Q = surf(NaN(2)); %// create object. surf needs matrix input
我在R2010b中用plot
和surf
进行了测试
方法3:使用copyobj
用于在另一个(可能不可见)图形中复制对象,然后从该图形中恢复该对象。这将自动适用于任何对象类型
%// Create the plot
P = plot(1:360, sind(1:360));
a = gca; %// get handle to axes
%// Make a copy in another figure
f_save = figure('visible','off');
a_save = gca;
P_saved = copyobj(P, a_save);
%// Delete the object
delete(P)
%// Recover it from the copy
P_recovered = copyobj(P_saved, a);
您只需使用
get
-命令将对象存储为structPG
(就像您已经做的那样),然后使用set
-命令一次设置所有参数。有些只读字段需要在设置它们之前删除,并且对象必须是同一类型。在下面的示例中,我们使用plot(0)
创建一个正在被上一个plot中的数据覆盖的plot
% Create the plot
figure
P = plot(1:360, sind(1:360));
% Store plot object
PG = get(P);
% Delete the plot
delete(P);
% Remove read-only fields of plot object
PG = rmfield(PG,{'Annotation','BeingDeleted','Parent','Type'});
% Create a new plot
figure
P = plot(0);
% Set the parameters
set(P,PG);
如果您不想手动删除字段,请使用
try catch
-块,并按照Luis Mendo的回答中所述迭代所有字段。谢谢,是的,我怀疑可能需要类似的内容。由于问题中未提及的原因,我无法编辑visible属性;基本上,有一个我无法隔离的bug,当我绘制其他对象时,它会删除线本身,我正试图找到一个解决方法来替换丢失的子对象。我来试试你的循环……使用try-catch
这个答案的优点是,只读字段是直接处理的,代码可以处理其他类型的对象,而无需先删除只读字段。在我的回答中,这必须手动完成。我使用copyobj
提供了一种更干净的方法,非常好,谢谢。那就行了。我添加了一个switch case块来获取对象类型,这样我就可以将其概括为line、surf等。这种方法的问题(这也是我现在删除的尝试)是,它似乎不能很好地适应例如surf。谢谢,我喜欢删除循环并在一行中完成它的吸引力,但正如您所说,Luis Mendo的try-catch块意味着您不必预先指定只读字段。