Lo que he aprendido: formato y exportación de figuras de Matlab

Matlab me está tocando la moral. Qué sorpresa. Me tiene tan sumamente cansada tener que programar en semejante entorno hostil (pun intended) que he decidido adoptar prácticas defensivas. Una de ellas es guardar las imágenes en el formato fig de Matlab y darles el formato que me parezca más tarde con una función. Aprovecho, además, para exportarlas a svg porque mi Matlab está borracho y no me exporta las fuentes correctamente cuando uso eps. Esto implica, claro, que necesito un paso posterior de pasar de svg a eps porque a las revistas no les gusta el svg. Ya veis, hacemos nosotras el currelo pero ellos se ponen exquisitos con los formatos. pero no importa porque viene el software libre al rescata, en este caso Inkscape.

En fin, que os dejo aquí la función que uso para cambiar el estilo de los gráficos y exportarlos y un script de muestra. No funciona bien si la figura tiene subfiguras, pero iremos mejorando.

Cambiar el estilo de una figura en Matlab

Para ello he escrito esta función, que se puede mejorar pero más o menos funciona:

function layout(h, fontSize, font, markerSize, lineWidth, gridOn, sizes)
% Change layout of graphic
%
% LAYOUT(h, fontSize, font, markerSize, lineWidth, gridOn, sizes)
% 
% where:
% - h: figure handle
% - fontSize: fontsize in points
% - font: name of font
% - markerSize: size of markers
% - lineWidth: line width 
% - gridOn: true set the grid to on
% - sizes: [width, height] of output

box on
set(gca,'FontSize', fontSize)
set(gca,'FontName', font)

% Change sizes of all elements
alldatacursors = findall(gcf,'type','hggroup');
set(alldatacursors,'FontSize', fontSize)
set(findall(gcf,'type','text'),'FontSize', fontSize)

% Change line width of all lines and markers
allLines = findall(gcf,'type','line');
set(allLines,'LineWidth', lineWidth)

% Set size of marker
if isprop(gca,'MarkerSize')
    set(h,'MarkerSize', markerSize)
end

% Grid
if gridOn
    grid on
end

x0 = 10;
y0 = 10;
set(gcf,'position',[x0,y0,sizes(1),sizes(2)])

Cambiar el estilo de todas las figuras de una carpeta

Uso la función layout en el archivo figStyle para dar formato y exportar a svg todas los gráficos de una carpeta. Supongo la siguiente estructura de archivos:

.
├── fig
│   ├── fig1.fig
│   └── fig2.fig
├── figStyle.m
├── layout.m
└── svg
    ├── fig1.svg
    └── fig2.svg

Es decir, cogeré las figuras de la carpeta fig y las guardaré en la carpeta svg después de transformadas. He escrito este script para la figuras del paper en el que estoy trabajando:

clear
clc

folder = 'fig';
addpath(genpath(pwd)) % Add subfolder to path
files = ls(folder);
files = files(3:end, 1:end); % delete first two entries (. and ..)
files = cellstr(files); % convert to cell to ease manipulation

number = size(files,1);

% Output names = names without extension
outName = cellfun(@(x) x(1:(end-4)), files, 'UniformOutput', false); 

for f = 1:number

    h = openfig(files{f},'new','invisible'); % open fig without showing
    layout(h, 24, 'Century Schoolbook', 14, 1.5, true, [800,600])

    % Save modified figure
    name = [folder '\..\svg\' outName{f}]; % saves figures in eps folder
    saveas(h,name,'svg')

    close(h);
end

Pasar de svg a eps

Una vez obtenidas las figuras en svg, uso un bucle en la terminal (de Windows) para pasarlas a eps con Inkscape. Aquí tuve líos petardos porque si pongo la carpeta de Inkscape en el Path, tengo un Python extra. Finalmente decidí que lo más práctico era llamar a Inkscape con la ruta completa. Por lo tanto, tiro esta línea en la carpeta donde están los svgs:

for %i in (*.svg) do "C:\Program Files\Inkscape\inkscape" -E %~ni.eps  %i

Aprendí gracias a esta historia que %~n es el nombre del archivo sin extensión. Ya os podéis imaginar la necesidad que tengo yo de saber mierdas cosas de la terminal de Windows. Ah, lo he guardado como svg2eps.cmd para futuro uso.

Y hala, cada día me vuelvo más robótica.


Suena:

Un pensamiento en “Lo que he aprendido: formato y exportación de figuras de Matlab

¡Opina sin miedo! (Puedes usar Markdown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s