有没有办法在MATLAB中将子图保存到变量?

问题描述 投票:2回答:1

在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个图中每个图的数据,而字幕包含子图的标题

有谁碰巧知道我怎么能达到我想要的目的?

matlab matlab-figure subplot
1个回答
2
投票

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

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);
© www.soinside.com 2019 - 2024. All rights reserved.