MATLAB Answers

3

How can I save a figure within app designer?

Asked by J. Webster on 27 Apr 2016
Latest activity Edited by Dharmendra Sharma on 15 Jun 2018 at 6:09

I've developed an application using the new App Designer. I'd like to have users be able to click a button and save a figure to a .fig file, or some other image format.

Following the accepted answer at http://www.mathworks.com/matlabcentral/answers/86693-save-axes-plot-as-fig-in-a-gui I tried...

function ButtonSaveFigureButtonPushed(app)
            newfigure = figure;
            copyobj(app.UIAxesAP, newfigure);
            hgsave(newfigure, 'testFIgure.fig');
end

But that gave me the error...

Error using matlab.ui.control.UIAxes/copyElement (line 1219)
Functionality not supported with UIAxes. For more information, see Graphics Support in App Designer.

What's the best way to go about this?

  1 Comment

Based on the number of recent views this is still an open issue. I have the same problem/question using R2017a.

Sign in to comment.

7 Answers

Answer by David
on 4 Apr 2018
Edited by David
on 4 Apr 2018

I spent some time on this for my own purposes. The trick is to save the individual values from the figure into local variables to be used in a figure as follows:

            h = figure;
            h.Visible = 'off';
            x = UIAxes.XAxis.Parent.Children.XData;
            y = UIAxes.XAxis.Parent.Children.YData;
            plot(x,y)
            lgndName1 = UIAxes.Legend.String{1};
            lgd = legend(lgndName1);
            lgd.Box = UIAxes.Legend.Box;
            lgd.Location = UIAxes.Legend.Location;
            h.CurrentAxes.YLabel.String = UIAxes.YLabel.String;
            h.CurrentAxes.YLabel.FontSize = UIAxes.YLabel.FontSize;
            h.CurrentAxes.XLabel.String = UIAxes.XLabel.String;
            h.CurrentAxes.XLabel.FontSize = UIAxes.XLabel.FontSize;
            h.CurrentAxes.Title.String = UIAxes.Title.String;
            h.CurrentAxes.Title.FontSize = UIAxes.Title.FontSize;
            h.CurrentAxes.XLim = [0 max(x)];
            h.CurrentAxes.XLim = [0 max(y)+1];
            saveas(h,SaveName,'jpg')
            savefig(h,SaveName)
            delete(h)

Notice I have the visibility off, because I don't want the user to see this going in the background.

Note: You will have to change "UIAxes" to whatever you've named your UI figure

You could also add more properties, but you will have to go into your figure and find the object name to use.

I hope this helps.

Edit: I should also mention that to get this to work as function, I had to make it a call function in a separate .m file. I made a function SaveFigures(UIAxes, SaveName) that is called when ButtonSaveFigureButtonPushed. I have multiple possible plots, which is why I allow the UIAxes to vary. (I use a switch case to make sure I save the correct plot.)

  4 Comments

Show 1 older comment

Is there not a way to save what is in the axis directly from the UI? It appears to me that you are simply recreating the image in another figure. I have a plot with a background picture and data plotted over the top and would like to be able to save it without recreating it in a separate figure. Thanks!

David, would it be possible to see more of this code? I am close to getting my app to do the same thing (I believe) that you wrote yours to do, but am missing something fairly minor.

Sign in to comment.


Answer by J. Webster on 28 Apr 2016

anybody??

  1 Comment

did u get a solution yet? I was looking to do the same

Sign in to comment.


Answer by Tobias Daßler on 20 Dec 2017

I used a workaround:

saveas(gca,uiputfile({'*.png'; '*.fig'; '*.jpg'}));
close Plot;

Maybe you could adapt this for your problem.

  1 Comment

Was this used in App Designer?

Sign in to comment.


Answer by Craig Pearson on 8 Jan 2018

I'm having a similar problem and would like a solution. I was trying to use the print function to copy a figure to the clipboard.

Annoyingly, if I use debugging mode, once the figure is created I can quit debugging mode then use

print -dmeta 

from the command window and it proceeds fine - I can then paste this into Excel from the command line (which is what I'm aiming to do from within the app).

Why can this not be achieved from within the App?

  0 Comments

Sign in to comment.


Answer by Guilherme Salgado Braga on 24 Feb 2018

According to the R2017b documentation on: https://www.mathworks.com/help/matlab/creating_guis/graphics-support-in-app-designer.html

Functions saveas and savefig are not yet supported.

  0 Comments

Sign in to comment.


Answer by Blanca Larraga on 4 Jun 2018 at 9:13

Is there a solution for saving the axes plot in a .jpeg format or not yet? I am trying to insert what I got un an axes figure within a report automatically in app designer but I don't manage to do so. Thanks.

  0 Comments

Sign in to comment.


Answer by Dharmendra Sharma on 15 Jun 2018 at 6:07
Edited by Dharmendra Sharma on 15 Jun 2018 at 6:09

This is the one potential solution which works for me. First, plot the figure/figures in normal way without using uifigure for example see code below. Visibility is on in the following example-

figure('Name','Acc','NumberTitle','off','units','normalized','outerposition',[0 0 1 1])

Then create a separate matlab function file (and call that matlab function from matlab ui). the function may include code to extract figure properties and save the figures as png file. The following link explains the saving all the figures and the code as well-- see the link--

Save all the plots

It just need some modifications and I included these in follwoing code-

        function [] = handleFigures()
        result = isfolder('figures');
        if result==0
            mkdir figures; 
        else
            delete('figures/*.*')
        end 
        FolderName = 'figures';   % Your destination folder
        FigList = findobj(allchild(0), 'flat', 'Type', 'figure');
        for iFig = 1:length(FigList)-1
          FigHandle = FigList(iFig);
          FigName   = get(FigHandle, 'Name');
          saveas(FigHandle, fullfile(FolderName, [FigName, '.png']))
        end
        disp('closing figures');
        close all
end

  0 Comments

Sign in to comment.


Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today