Exportar figuras de App Designer en Matlab

Publicado el 20 noviembre 2020 por Daniel Rodríguez @analyticslane

Cuando queremos exportar guardar en un archivo las figuras que hemos creado en Matlab disponemos de la función saveas(). Aunque desafortunadamente esa no funciona cuando en ejes ubicados dentro de aplicaciones de App Designer. Ni tampoco en el caso de Guide. En estas situaciones, para poder exportar figuras de App Designer es necesario copiar el contenido de los ejes en una figura oculta e imprimir esta. Veamos a continuación cómo se puede hacer esta tarea de una forma fácil.

La función saveas()

En Matlab la función saveas() nos permite exportar el contenido de una figura a un archivo. Siendo necesario indicar un primer parámetro con la figura que se desea exportar y un segundo con el nombre del archivo.

El problema está cuando deseamos exportar el contenido un eje en una aplicación creada en App Designer. En este caso si se indica en primer lugar el eje (por ejemplo, app.UIAxes) lo que nos devuelve la función es el siguiente error.

Error in saveas (line 181)
        print( h, name, ['-d' dev{i}] )

La solución a este problema pasa por volver a crear la gráfica en una figura y exportar esta. Aunque puede ser más fácil copiar el contenido de la figura.

Función para exportar figuras de App Designer

El problema se puede solucionar con la siguiente función.

function exportFigure(ax, filename)

if nargin == 1
    [filename, path] = uiputfile({ ...
        '*.jpeg', 'JPEG files (*.jpeg)'; ...
        '*.png',  'Portable Network Graphics files (*.png)'; ...
        '*.tiff', 'TIFF image files (*.tiff)'; ...
        '*.bmp',  'BMP files (*.bmp)'}, ...
        'Select a file to export');
    
    if filename == 0
        return;
    else
        filename = fullfile(path, filename);
    end
end

   
% Creación de una figura invisible
fig = figure;
fig.Visible = 'off';
figAxes = axes(fig);

% Copia de los ejes y objetos hijos en la figura
copyobj(ax.XAxis.Parent.Children, figAxes)
figAxes.XLim = ax.XLim;
figAxes.YLim = ax.YLim;
figAxes.ZLim = ax.ZLim;
figAxes.DataAspectRatio = ax.DataAspectRatio;

% Guardado de la figura en el archivo
saveas(fig, filename);

% Borrado de la figura temporal
delete(fig);

end

Esta función tiene dos parámetros: la referencia al objeto UIAxes y el nombre de un archivo. El primer parámetro es obligatorio, pero no el segundo, si no se introduce aparecerá un asistente para pedir el nombre del archivo y la ubicación. Para lo que se utiliza la función uiputfile(). Si no se selecciona ningún archivo en programa termina.

A continuación, viene la parte interesante del programa. En la que se crea una nueva figura oculta y se obtienen sus ejes. Posteriormente se copia todo el contenido del eje original en el de la figura y las opciones de representación. En este momento, tendríamos una copia exacta de la gráfica de la aplicación en la figura externa. Por lo que se puede guardar en el archivo.

Ahora es necesario destruir la figura temporal que se ha creado. Ya que de otro modo quedaría ocupando un espacio innecesario en memoria.

Conclusiones

En esta esta entrada se ha visto cómo solucionar un problema en nuestras aplicaciones de App Designer: la posibilidad de exportar directamente las figuras. Una función con la que se puede mejorar fácilmente las aplicaciones, especialmente aquellas que diseñamos para procesar datos que luego se deben incluir en informes.

Imagen de Elias Sch. en Pixabay