Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中重新打印已删除的对象_Matlab_Graphics_Matlab Figure - Fatal编程技术网

在MATLAB中重新打印已删除的对象

在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:不要删除它,使其不可见 您可

是否可以使用“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:不要删除它,使其不可见 您可以使对象不可见,而不是删除和重新创建对象:

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
-命令将对象存储为struct
PG
(就像您已经做的那样),然后使用
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块意味着您不必预先指定只读字段。