有什么方法可以将子图保存到MATLAB中的变量?

时间:2019-05-01 13:46:01

标签: matlab matlab-figure subplot

在matlab的一段代码中,我生成了一个图,其中出现了5个不同的子图。我希望可以将这些子图保存为变量,以便以后可以调用这些子图之一,并在自己的图中打开相同的子图(因此,可以根据需要更精确地查看它们)。不幸的是,我本人无法弄清楚该怎么做。

我知道整个图形可以按照此处描述的方式保存到变量中:https://nl.mathworks.com/matlabcentral/answers/160049-how-to-assign-a-plot-to-a-variable

但是,这只会保存该图形,直到它在您首次创建后一直保持打开状态。最重要的是,它没有说明如何对子图进行相同的操作。

我通过以下方式生成子图:


for i = 1:length(figuredata)
        subplot(2,3,i);                                           % select subplot
        plot(figuredata{1,i},figuredata{2,i},'r.') , grid on;     % plot the figure
        title(figuretitles{i});                                   % set title
        ylabel('SIN'), xlabel('COS'),grid on;                     % label the axes
        axis([0 16384 0 16384]);    axis('square');               % set axis range for x and y
end

figuredata是一个2 x 5的单元格数组,其中包含5个图的每一个的数据,figuretitles包含子图的标题

有人碰巧知道我如何实现我想要的吗?

1 个答案:

答案 0 :(得分:2)

您首先需要了解的一件事是graphics object handles的概念。在MATLAB中, handle 是对特定图形对象的引用。您可以使用手柄访问和更改对象的属性。句柄和实际对象本身应被视为独立的(但相关)实体。例如:

hFigure = figure();  % Create figure window and return handle
clear hFigure        % Clear variable containing handle

这将创建一个图形窗口,并将该窗口的句柄存储在变量hFigure中,然后清除该变量。但是,该图仍然存在,因为我们仅丢弃了引用该对象的句柄。或者:

hFigure = figure();  % Create figure window and return handle
delete(hFigure);     % Delete the graphics object
get(hFigure)         % Use handle to try and access the object properties
Error using matlab.ui.Figure/get
Invalid or deleted object.

这将创建一个图形窗口,将该窗口的句柄存储在变量中,然后删除图形。删除对象后,该句柄将不再有效,如果尝试使用它,则会收到错误消息。

现在牢记这一点,您可以使用一些选项来移动,保存和重新显示图形对象。假设您有一个尚未关闭或删除的现有子图(即axes object),则可以通过修改Parent property将对象重新放置到新窗口中。例如:

hAxes = subplot(2, 2, 1);
plot(hAxes, [1 2], [1 2], 'r');
hFigure = figure();
set(hAxes, 'Parent', hFigure);

这将创建一个子图,然后将其移动到新窗口。请注意,轴不再存在于原始窗口中,但仍然具有与之相同的位置,大小等。如果您希望它以其他方式显示(例如,较大的图以填充新窗口),则必须在移动它后修改其属性。

另一种替代方法是使用copyobj函数:

hAxes = subplot(2, 2, 1);
plot(hAxes, [1 2], [1 2], 'r');
hFigure = figure();
copyobj(hAxes, hFigure);

这将复制axis对象,因此现在有两个独立的图形对象,每个窗口中一个。

如果您要处理的是原始图形将被关闭的情况,并且您想保存轴对象的副本以便以后再显示,则可以使用undocumented (or semi-documented) functions handles2struct and struct2handle进行操作。这是一个示例,该示例创建一个在其中绘制了一条线的轴,将轴对象结构存储在.mat文件中(使用save),然后加载该结构并将其添加到新图形中:

hAxes = subplot(2, 2, 1);
plot(hAxes, [1 2], [1 2], 'r');
axesStruct = handle2struct(hAxes);
save('Axes_data.mat', 'axesStruct');

clear all;
close all;

load('Axes_data.mat');
hFigure = figure();
hAxes = struct2handle(axesStruct, hFigure);