MATLAB: Plot with engineering format axis


% Convierte un número a formato ingeniería y
% lo devuelve convertido en cadena de caracteres.
% El número de argumentos es variable porque puede ser 1 o 2.
% Si le pasamos un argumento, será simplemente el número a convertir, y si
% le pasamos 2 argumentos, el primero será el número y el segundo una
% opción para que se pueda poner el prefijo de la unidad de ingeniería
% (mili(m), micro(u),nano(n),...). Dicha opción debe ser '-prefix'
%
% engineeringFormat(0.35, '-prefix')
% ans = 350 m
%
% engineeringFormat(0.35)
% ans = 350e-3
%
%
%

function cadena = engineeringFormat(varargin)

% Miramos cuantos argumentos le hemos pasado a la función
if nargin==1 % Un argumento
vector = varargin{1};
prefix = 0;

elseif nargin>1 % Dos argumentos (o más, que serían ignorados)
vector = varargin{1};
if strcmp(varargin{2},'-prefix')
prefix = 1;
else
prefix = 0;
end

else % En otro caso, no salimos de la función
ST = dbstack;
functionname = ST.name;
fprintf('ERROR: Incorrect usage of function ''%s''\n',functionname(1,:));
fprintf('Not enough input arguments.\n');
return;
end

len=length(vector);

for index=1:len

numero=vector(index);

if (abs(numero)<1000 && abs(numero)>=1)||(numero==0)
% Si el número está entre 1 y 1000 (o es 0 exacto), se deja sin
% exponente.
aux=num2str(numero);
cadena(index,1:length(aux)) = aux;
else
exponente = floor(log10(abs(numero)));

resto = mod(exponente,3);

if resto>0
exponente = exponente - resto;
end

base = numero*10^(-exponente);

if exponente>=0
signo = '+';
aux=sprintf('%ge%c%i',base,signo,exponente);
cadena(index,1:length(aux)) = aux;
else
aux=sprintf('%ge%i',base,exponente);
cadena(index,1:length(aux)) = aux;
end
end

% Le ponemos el prefijo en caso de que lo queramos
if prefix==1 && exist('exponente','var')
switch exponente
case -18 % Atto
pref = 'a';
case -15 % Femto
pref = 'f';
case -12 % Pico
pref = 'p';
case -9 % Nano
pref = 'n';
case -6 % Micro
pref = 'u';
case -3 % Mili
pref = 'm';
case 3 % Kilo
pref = 'k';
case 6 % Mega
pref = 'M';
case 9 % Giga
pref = 'G';
case 12 % Tera
pref = 'T';
case 15 % Peta
pref = 'P';
case 18 % Exa
pref = 'E';
otherwise
return; % Si se sale de estos rangos, no se le pone el prefijo.
end

if mod(base,1)==0
aux=sprintf('%1.0f %s\n',base,pref);
else
aux=sprintf('%1.3f %s',base,pref);
end
cadena(index,1:length(aux)) = aux;

end

end

 

Download the file engineeringFormat.m