重新绘制已删除的对象MATLAB

时间:2015-07-14 08:21:42

标签: 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)  % ?????

我希望它是可推广的,即解决方案适用于表面图,线图,文本注释等。

2 个答案:

答案 0 :(得分:5)

方法1:不要删除它,使其不可见

不是删除和重新创建对象,而是可以使其不可见:

set(P, 'visible', 'off')

再次可见

set(P, 'visible', 'on')

方法2:使用循环

创建对象并设置属性值

如果您确实要重新创建已删除的对象,可以按以下步骤操作:创建相同类型的对象并使用for循环将其属性设置为存储的值。需要try-catch块,因为某些属性是只读的并发出错误。

%// 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中使用plotsurf对此进行了测试。

方法3:使用copyobj

制作对象的副本并将其恢复

使用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);

答案 1 :(得分:1)

您可以使用PG命令(就像您已经执行的那样)将对象存储为结构get,然后使用set - 命令一次设置所有参数。有些只读字段需要在设置之前删除,并且对象必须属于同一类型。在下面的示例中,我们使用plot(0)创建一个用上一个图中的数据覆盖的图。

% 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的答案中所述迭代所有字段。