leyenda - subplot matlab
Trazando 4 curvas en una sola trama, con 3 ejes y (5)
Tengo 4 conjuntos de valores: y1
, y2
, y3
, y4
y un conjunto x
. Los valores y son de diferentes rangos, y debo trazarlos como curvas separadas con conjuntos separados de valores en el eje y.
Para decirlo de manera simple, necesito 3 ejes y con diferentes valores (escalas) para trazar en la misma figura.
Cualquier ayuda apreciada, o consejos sobre dónde buscar.
Esta es una gran oportunidad para presentarle el intercambio de archivos. Aunque últimamente la organización ha sufrido algunas opciones desafortunadas de diseño de interfaz, sigue siendo un gran recurso para soluciones preempacadas a problemas comunes. Aunque muchos aquí le han dado los detalles sangrientos de cómo lograr esto (@prm!), Tuve una necesidad similar hace unos años y descubrí que addaxis funcionó muy bien. (¡Fue una selección de intercambio de archivos de la semana en un momento!) Ha inspirado más tarde, probablemente mejores mods . Aquí hay un ejemplo de salida:
ejemplo de addaxis http://www.mathworks.com/matlabcentral/fx_files/9016/1/addaxis_screenshot.jpg
Acabo de buscar "plotyy" en File Exchange.
Si bien es importante comprender lo que está sucediendo, a veces solo necesitas hacer las cosas, no las hagas tú mismo. Matlab Central es genial para eso.
Los diagramas de escala múltiple son raros de encontrar más allá de dos ejes ... Afortunadamente en Matlab es posible, pero tienes que superponer completamente ejes y jugar con marcas para no ocultar información.
A continuación hay una buena muestra de trabajo. Espero que esto sea lo que estás buscando (¡aunque los colores podrían ser mucho mejores)!
close all
clear all
display(''Generating data'');
x = 0:10;
y1 = rand(1,11);
y2 = 10.*rand(1,11);
y3 = 100.*rand(1,11);
y4 = 100.*rand(1,11);
display(''Plotting'');
figure;
ax1 = gca;
get(ax1,''Position'')
set(ax1,''XColor'',''k'',...
''YColor'',''b'',...
''YLim'',[0,1],...
''YTick'',[0, 0.2, 0.4, 0.6, 0.8, 1.0]);
line(x, y1, ''Color'', ''b'', ''LineStyle'', ''-'', ''Marker'', ''.'', ''Parent'', ax1)
ax2 = axes(''Position'',get(ax1,''Position''),...
''XAxisLocation'',''bottom'',...
''YAxisLocation'',''left'',...
''Color'',''none'',...
''XColor'',''k'',...
''YColor'',''r'',...
''YLim'',[0,10],...
''YTick'',[1, 3, 5, 7, 9],...
''XTick'',[],''XTickLabel'',[]);
line(x, y2, ''Color'', ''r'', ''LineStyle'', ''-'', ''Marker'', ''.'', ''Parent'', ax2)
ax3 = axes(''Position'',get(ax1,''Position''),...
''XAxisLocation'',''bottom'',...
''YAxisLocation'',''right'',...
''Color'',''none'',...
''XColor'',''k'',...
''YColor'',''g'',...
''YLim'',[0,100],...
''YTick'',[0, 20, 40, 60, 80, 100],...
''XTick'',[],''XTickLabel'',[]);
line(x, y3, ''Color'', ''g'', ''LineStyle'', ''-'', ''Marker'', ''.'', ''Parent'', ax3)
ax4 = axes(''Position'',get(ax1,''Position''),...
''XAxisLocation'',''bottom'',...
''YAxisLocation'',''right'',...
''Color'',''none'',...
''XColor'',''k'',...
''YColor'',''c'',...
''YLim'',[0,100],...
''YTick'',[10, 30, 50, 70, 90],...
''XTick'',[],''XTickLabel'',[]);
line(x, y4, ''Color'', ''c'', ''LineStyle'', ''-'', ''Marker'', ''.'', ''Parent'', ax4)
texto alternativo http://www.pablorodriguez.info/wp-content/Multiaxes.png
Sé de plotyy que te permite tener dos ejes y, pero no "plotyyy"!
Tal vez pueda normalizar los valores y para tener la misma escala (normalización min / max, estandarización zscore, etc.), entonces puede trazarlos fácilmente usando la plot, hold
normal plot, hold
secuencia.
Aquí hay un ejemplo:
%# random data
x=1:20;
y = [randn(20,1)*1 + 0 , randn(20,1)*5 + 10 , randn(20,1)*0.3 + 50];
%# plotyy
plotyy(x,y(:,1), x,y(:,3))
%# orginial
figure
subplot(221), plot(x,y(:,1), x,y(:,2), x,y(:,3))
title(''original''), legend({''y1'' ''y2'' ''y3''})
%# normalize: (y-min)/(max-min) ==> [0,1]
yy = bsxfun(@times, bsxfun(@minus,y,min(y)), 1./range(y));
subplot(222), plot(x,yy(:,1), x,yy(:,2), x,yy(:,3))
title(''minmax'')
%# standarize: (y - mean) / std ==> N(0,1)
yy = zscore(y);
subplot(223), plot(x,yy(:,1), x,yy(:,2), x,yy(:,3))
title(''zscore'')
%# softmax normalization with logistic sigmoid ==> [0,1]
yy = 1 ./ ( 1 + exp( -zscore(y) ) );
subplot(224), plot(x,yy(:,1), x,yy(:,2), x,yy(:,3))
title(''softmax'')
Una posibilidad que puede intentar es crear 3 ejes apilados uno encima del otro con las propiedades ''Color''
de los dos superiores fijados en ''none''
para que todos los gráficos estén visibles. Tendría que ajustar el ancho de los ejes, la posición y los límites del eje x para que los 3 ejes y estén uno al lado del otro en lugar de uno encima del otro. También querrá eliminar las marcas y las etiquetas del eje x de 2 de los ejes, ya que se colocarán una encima de la otra.
Aquí hay una implementación general que calcula las posiciones adecuadas para los ejes y compensaciones para los límites del eje x para mantener las trazas alineadas correctamente:
%# Some sample data:
x = 0:20;
N = numel(x);
y1 = rand(1,N);
y2 = 5.*rand(1,N)+5;
y3 = 50.*rand(1,N)-50;
%# Some initial computations:
axesPosition = [110 40 200 200]; %# Axes position, in pixels
yWidth = 30; %# y axes spacing, in pixels
xLimit = [min(x) max(x)]; %# Range of x values
xOffset = -yWidth*diff(xLimit)/axesPosition(3);
%# Create the figure and axes:
figure(''Units'',''pixels'',''Position'',[200 200 330 260]);
h1 = axes(''Units'',''pixels'',''Position'',axesPosition,...
''Color'',''w'',''XColor'',''k'',''YColor'',''r'',...
''XLim'',xLimit,''YLim'',[0 1],''NextPlot'',''add'');
h2 = axes(''Units'',''pixels'',''Position'',axesPosition+yWidth.*[-1 0 1 0],...
''Color'',''none'',''XColor'',''k'',''YColor'',''m'',...
''XLim'',xLimit+[xOffset 0],''YLim'',[0 10],...
''XTick'',[],''XTickLabel'',[],''NextPlot'',''add'');
h3 = axes(''Units'',''pixels'',''Position'',axesPosition+yWidth.*[-2 0 2 0],...
''Color'',''none'',''XColor'',''k'',''YColor'',''b'',...
''XLim'',xLimit+[2*xOffset 0],''YLim'',[-50 50],...
''XTick'',[],''XTickLabel'',[],''NextPlot'',''add'');
xlabel(h1,''time'');
ylabel(h3,''values'');
%# Plot the data:
plot(h1,x,y1,''r'');
plot(h2,x,y2,''m'');
plot(h3,x,y3,''b'');
y aquí está la figura resultante:
plotyy permite dos ejes Y diferentes. O puede mirar en LayerPlot desde File Exchange. Supongo que debería preguntar si has considerado usar HOLD o simplemente volviendo a escalar los datos y usando una antigua trama normal.
ANTIGUO , no es lo que el OP estaba buscando: SUBPLOT permite dividir una ventana de figura en múltiples ejes. Entonces, si desea que solo se muestre un eje x u otra personalización, puede manipular cada eje de forma independiente.