MATLAB: Can I save UIAxes plot in anyway

MATLABplotsavesave uiaxisuiaxesuiaxis

Hi!
How do I save a plot I made with UIAxes, ie. NOT with figure – I tried print but it didn't work and I don't understand why. Is there ANYWAY to save a UIAxes plot?
My question is about Appdesigner.

Best Answer

Update: Try using copyUIAxes() from the file exchange.
[original post below]
There's no way to directly save the 'figure' produced by UIAxes in app designer (bummer). An alternative would have been to copy the UIAxes onto a new figure using copyobj(axHand, figHand) which works with axes developed in guide() but that functionality is not supported with UIAxes from app designer (double bummer).
A workaround is, from within your app,
  1. Create a new figure and new axes
  2. Copy the UIAxes children on to the new axes
  3. Copy most of the UIAxes properties over to the new axes
Some axes properties are read-only so we can't copy those over to the new axes. Also, there are some axes properties that you don't want to copy over such as parent, children, X/Y/ZAxis, which will cause errors. In addition to those, you'll see in the code below where I added the "Position" and "OuterPosition" properties to the list of properties not to copy. In your app, the axes are probably small and if you want your new axes to also be the same size, you could remove the two position properties from the 'badFields' list.
% Create new figure and new axes
figure
axNew = axes;
% Copy all objects from UIAxes to new axis
copyobj(app.UIAxes.Children, axNew)
% Save all parameters of the UIAxes
uiAxParams = get(app.UIAxes);
uiAxParamNames = fieldnames(uiAxParams);
% Get list of editable params in new axis
editableParams = fieldnames(set(axNew));
% Remove the UIAxes params that aren't editable in the new axes (add others you don't want)
badFields = uiAxParamNames(~ismember(uiAxParamNames, editableParams));
badFields = [badFields; 'Parent'; 'Children'; 'XAxis'; 'YAxis'; 'ZAxis';'Position';'OuterPosition'];
uiAxGoodParams = rmfield(uiAxParams,badFields);
% set editable params on new axes
set(axNew, uiAxGoodParams)
For trouble shooting, or to loop through each property rather then setting them all at once, replace the last line of the code above with this for-loop below which indicates the property being edited in the command window.
% Set new axis params
allf = fieldnames(uiAxGoodParams);
for i = 1:length(allf)
fprintf('Property #%d: %s\n', i, allf{i});
set(axNew, allf{i}, uiAxGoodParams.(allf{i}))
end
One alternative worth mentioning: Instead of your app hosting the axes, you could program your app to plot the data onto an external figure and then you wouldn't have this problem.