从MATLAB GUI保存绘图时包括轴标签

时间:2015-02-19 21:36:46

标签: matlab matlab-figure matlab-guide

我编写了以下代码,尝试从MATLAB GUI中仅检索轴及其图。

F = getframe(gca);
figure();
image(F.cdata);
saveas(gcf,'PlotPic','png');
close(gcf);
但是,我注意到,此方法不包含任何轴标签或标题。有什么方法可以让getframe函数包含轴标签和标题吗?

我尝试了以下代码,但它完全相同

pl = plot(x,y);
xlabel('x')
ylabel('y')

ftmp = figure;
atmp = axes;
copyobj(pl,atmp);
saveas(ftmp,'PlotPic.png');
delete(ftmp);

1 个答案:

答案 0 :(得分:1)

我会使用rect函数的getframe选项。

基本上,您可以为getframe提供第二个输入参数,然后捕获指定为参数的矩形的内容。好处是您可以将控制柄用于轴,因此它不会捕获整个GUI图形,而是捕获特定的轴。

例如,使用此行:

F = getframe(gca,RectanglePosition);

具体而言,您可以设置矩形的坐标,使它们跨越轴标签和标题。这是一个示例代码。按钮回调执行getframe并打开一个内容为F.cdata的新数字:

function GUI_GetFrame
clc
clear
close all

%// Create GUI components
hFigure = figure('Position',[100 100 500 500],'Units','Pixels');

handles.axes1 = axes('Units','Pixels','Position',[60,90,400,300]);
handles.Button = uicontrol('Style','Push','Position',[200 470 60 20],'String','Get frame','Callback',@(s,e) GetFrameCallback);

%// Just create a dummy plot to illustrate
handles.Period = 2*pi;
handles.Frequency = 1/handles.Period;

handles.x = 0:pi/10:2*pi;
handles.y = rand(1)*sin(handles.Period.*handles.x);

plot(handles.x,handles.y,'Parent',handles.axes1)
title('This is a nice title','FontSize',18);
guidata(hFigure,handles); %// Save handles structure of GUI.

    function GetFrameCallback(~,~)

        handles = guidata(hFigure);
        %// Get the position of the axes you are interested in. The 3rd and
        %// 4th coordinates are useful (width and height).

        AxesPos = get(handles.axes1,'Position');    

        %// Call getframe with a custom rectangle size.You might need to change this.
        F = getframe(gca,[-30 -30 AxesPos(3)+50 AxesPos(4)+80]);

        %// Just to display the result
        figure()
        imshow(F.cdata)        
    end
end

GUI如下所示:

enter image description here

一旦我按下按钮,这就是弹出的数字:

enter image description here

所以唯一的麻烦就是要弄清楚你需要选择的矩形尺寸来捕捉轴标签和标题。

希望能解决你的问题!