【问题标题】:Is there any way to save a subplot to a variable in MATLAB?有什么方法可以将子图保存到 MATLAB 中的变量中?
【发布时间】:2019-09-20 01:54:19
【问题描述】:

在 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 包含子绘图的标题

有没有人碰巧知道我怎样才能实现我想要的?

【问题讨论】:

  • 您链接的那个答案不是关于保存图形,而是将句柄保存到图形。图形句柄是可用于操作和修改图形的对象。 subplot 也返回一个句柄,但这个句柄是一个轴对象。您可以以几乎相同的方式使用它。
  • 你应该从这里开始阅读:mathworks.com/help/matlab/creating_plots/…

标签: matlab matlab-figure subplot


【解决方案1】:

首先需要了解的一点是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);

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

如果您正在处理原始图窗将被关闭的情况,并且您想要保存坐标区对象的副本以便以后重新显示它们,您可以使用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);

【讨论】:

  • 这对我来说是新的。要保存整个图形窗口,s=handle2struct(gcf),然后是struct2handle(s,groot)。我喜欢groot 对象...
  • "handle2struct" 对我来说也是新的。似乎应该正确记录并提升到黄金时间的功能。查看(非常少的)帮助文件,看起来孩子们最终都成为子结构。因此,子图轴都将在图形范围命令中捕获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多