miércoles, 19 de enero de 2011

Cómo añadir un eje secundario en un gráfico

A veces resulta interesante representar en un mismo gráfico dos curvas distintas. Si estas curvas tienen distintas unidades o se mueven en un distinto rango, habría que trabajar con dos ejes distintos. Esto se puede hacer fácilmente con la función "plotyy". Sin embargo, si queremos editar los ejes, es un poco más complejo. En esta entrada, muestro cómo se puede hacer.

Por ejemplo, si quiero representar las dos curvas siguientes:

t = [0:0.05:10]';
y1 = sin(t);
y2 = 5*cos(2*pi*t/6);

Primero, defino los rangos, ticks, y colores de cada curva:

y1lim = [-1.5,1.5];
y1ticks = [-1.5:0.5:1.5];
y1tickslabel = {'-1.5','-1.0','-0.5','0.0','0.5','1.0','1.5'};
y1string = 'sin(t)';

y2lim = [-6,6] ;
y2ticks = [-6:2:6];
y2tickslabel = {'-6','-4','-2','0','2','4','6'};
y2string = '5\cdot cos(2\cdot \pi /6 \cdot t)';

x1lim = [0,10];
x1ticks = [0:2.5:10];
x1tickslabel = {'0.0','2.5','5.0','7.5','10.0'};
x1string ='time';

color1 = [0 0.2 0.9];
color2 = [0 0.5 0.1];


A continuación, represento las dos curvas con el siguiente código:

figure1 = figure(1);

axes1 = axes('Parent',figure1,...
'YTick',y1ticks,'YTickLabel',y1tickslabel,...
'XTick',[],...
'ColorOrder',[color2; color1],...
'YColor',color1,...
'Fontsize',10);
xlim(axes1,x1lim);
ylim(axes1,y1lim);
box(axes1,'on');
hold(axes1,'all');
plot(t,y1,'Parent',axes1,'LineWidth',1);
ylabel(y1string,'Color',color1);

axes2 = axes('Parent',figure1,...
'YTick',y2ticks,'YTickLabel',y2tickslabel,...
'XTick',x1ticks,'XTickLabel',x1tickslabel,...
'ColorOrder',[color1; color2],...
'YColor',color2,...
'Color','none',...
'Fontsize',10,...
'YAxisLocation','right');
xlim(axes2,x1lim);
ylim(axes2,y2lim);
hold(axes2,'all');
plot(t,y2,'Parent',axes2,'LineWidth',1);
ylabel(y2string,'Color',color2);
xlabel(x1string);
title('sinusoidales');


Nota: El eje de las x está pintado solo en "axes2". En "axes1" puse "'XTick',[]" para que no escribiera nada. De no hacerlo así, el eje de las x se escribiría dos veces, uno sobre el otro, y quedaría un poco feo.

No hay comentarios: