Trazando 4 curvas en una sola ttwig, con 3 ejes y

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.

Una posibilidad que puede intentar es crear 3 ejes astackdos 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 tags 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:

enter image description here

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') 

plotyynormalización

Los diagtwigs 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

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 ttwig normal.

ANTIGUO , no es lo que el OP estaba buscando: SUBPLOT le 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.