(MATLAB) 我可以使用 copyfile 将导入的数据从 GUI 中的轴重新绘制到新图形吗?

(MATLAB) Can I re-plot imported data from axes in GUI to new figure using copyfile?

你好,我制作了一个带有按钮的 GUI select 一个包含文件的文件夹,然后将它们全部绘制在 GUI 中的单个轴上。

我还做了一个按钮,这样如果用户想在新图中打开这个图,他们就可以。但是,对于此按钮,他们必须再次 select 相同的文件夹(我所做的只是包括图形;轴;在相同的代码中)。但是有没有办法保存 selected 的数据,这样他们就不必再次选择文件夹了?我正在考虑使用复制文件功能,但我不知道该怎么做...

这是第一个按钮(导入数据)的代码:

d= uigetdir(pwd, 'Select a folder');

files = dir(fullfile(d, '*.txt'));

len = length(files);

linecolors = jet(len);

for i = 1:len

a = files(i).name;

filename{i} = a;

path = [d,'\',a];

data = dlmread(path);

plot(data(:,1), data(:,2),'color',linecolors(i,:),'linewidth',2);

hold on;

end

hold off;

xlabel('Intensity','fontweight','bold');

ylabel('Wave Number','fontweight','bold');

title('Spectra Plot','fontweight','bold','fontsize',14);

legend(filename,'Interpreter','none', 'location', 'southoutside');

这是第二个按钮(在新图中打开)的代码,只有 2 行(第 5 行和第 6 行):

d= uigetdir(pwd, 'Select a folder');

files = dir(fullfile(d, '*.txt'));

len = length(files);

linecolors = jet(len);

figure();

axes;

for i = 1:len

a = files(i).name;

filename{i} = a;

path = [d,'\',a];

data = dlmread(path);

plot(data(:,1), data(:,2),'color',linecolors(i,:),'linewidth',2);

hold on;

end

hold off;  

xlabel('Intensity','fontweight','bold');

ylabel('Wave Number','fontweight','bold');

title('Spectra Plot','fontweight','bold','fontsize',14);

legend(filename,'Interpreter','none', 'location', 'southoutside');

有人可以帮忙吗?

谢谢

薇拉

您可以在 Matlab 中使用 savefig 命令保存图形,按下按钮即可加载该图形。 写入

 savefig('figure1.fig') 

在第一段代码的末尾。而只是

openfig('figure1.fig','new')

在第二位代码中。

编辑:现在我读了你对另一个答案的评论,有一种更快的方法来做你想做的事。第一个答案解释了如何从你的 gui 的不同部分保存和检索值,但你所需要的只是在一个新的图形中复制你的轴。

所以实现这一点的另一种方法是: 为按钮 1 保留完全相同的代码(我的代码甚至是你的原始代码),然后为按钮 2:

hfig = ancestor(gcbo,'figure') ;        %// find the handle of the current figure
hax = findobj( hfig , 'type', 'axes') ; %// find the handle of the axes inside the main figure
hfig2 = figure ;                        %// create a new figure
hax2  = copyobj(hax,hfig2);             %// make a full copy of the axes in the new figure

这样您就不必重新读取所有文件并加载数据。


初始答案:

您可以使用setappdata and getappdata命令在图形应用程序数据中保存参数或变量。

在你的情况下,你可以保存文件列表,这样你就不需要再次检索它(假设你总是先使用按钮 1)。

实际绘制的函数可以分开,不需要重复代码。只需使用目标 axes 的句柄(地址)作为参数。

所以 按钮 1 的代码

%// get the folder location and list of files
d= uigetdir(pwd, 'Select a folder');
fileList = dir(fullfile(d, '*.txt'));

hfig = ancestor(gcbo,'figure') ;        %// find the handle of the current figure
hax = findobj( hfig , 'type', 'axes') ; %// find the handle of the axes inside the main figure

setappdata( hfig , 'fileList' , fileList ) ; %// save the file list in the figure application data

plot_files( fileList , hax ) %// call the ploting function, specifying the CURRENT axes as destination

按钮 2 的代码

hfig = ancestor(gcbo,'figure') ;                %// find the handle of the current figure
fileList = getappdata( hfig , 'fileList' ) ;    %// retrieve the file list in the figure application data
hfig2 = figure ;                                %// create a new figure
hax2 = axes('Parent',hfig2) ;                   %// create an axes in the new figure
plot_files( fileList , hax2 ) %// call the ploting function, specifying the NEW axes as destination*

.m 文件末尾的某处,放置 绘图函数:

%% // Code for function to place somewhere at the bottom of your .m file
function plot_files( fileList , selectedAxe )
    len = length(files);
    linecolors = jet(len);

    for i = 1:len
        a = files(i).name;
        filename{i} = a;
        path = [d,'\',a];
        data = dlmread(path);
        plot(data(:,1), data(:,2),'color',linecolors(i,:),'linewidth',2,'Parent',selectedAxe );
        hold on;
    end

    hold off;
    xlabel('Intensity','fontweight','bold');
    ylabel('Wave Number','fontweight','bold');
    title('Spectra Plot','fontweight','bold','fontsize',14);
    legend(filename,'Interpreter','none', 'location', 'southoutside');
end

注意:根据代码中其他函数的定义方式,您可能必须删除绘图函数的最后一个 end。 (如果你所有的函数都以 end 结束,那么保留这个,否则就删除它)。