2009-11-12 14 views
28

Ho 4 set di valori: y1, y2, y3, y4 e un set x. I valori y sono di intervalli diversi e ho bisogno di tracciarli come curve separate con set di valori separati sull'asse y.Tracciamento di 4 curve in un unico grafico, con 3 assi y

Per semplificare, ho bisogno di 3 assi y con valori diversi (scale) per tracciare sulla stessa figura.

Qualsiasi aiuto apprezzato o suggerimenti su dove cercare.

risposta

22

Questa è una grande occasione per farvi conoscere la File Exchange. Anche se l'organizzazione di ritardo ha sofferto di alcune scelte di design di interfaccia molto Purtroppo, è ancora una grande risorsa per soluzioni preconfezionate a problemi comuni. Sebbene molti qui vi abbiano fornito i dettagli cruenti su come ottenere questo risultato (@prm!), Ho avuto un bisogno simile qualche anno fa e ho trovato che addaxis funzionava molto bene. (Era un File Exchange pick of the week a un certo punto!) Ha ispirato later, probably better mods. Ecco qualche esempio di output:

addaxis example http://www.mathworks.com/matlabcentral/fx_files/9016/1/addaxis_screenshot.jpg

Ho appena cercato per "plotyy" presso File Exchange.

Anche se capire che cosa sta succedendo nella importante, a volte solo bisogno di fare le cose, non lo fanno da soli. Matlab Central è perfetto per questo.

+0

C'è qualcosa di simile per l'asse x? – smihael

2

PLOTYY consente due diversi assi y. Oppure potresti cercare LayerPlot da File Exchange. Suppongo che dovrei chiederti se hai preso in considerazione l'utilizzo di HOLD o semplicemente ridimensionare i dati e utilizzare il normale vecchio diagramma?

VECCHIO, non ciò che il PO è stato alla ricerca di: SUBPLOT permette di rompere una finestra cifra in più assi. Quindi, se si desidera visualizzare solo un asse x, o qualche altra personalizzazione, è possibile manipolare ciascun asse in modo indipendente.

+0

No. Non è quello. Ho bisogno di loro su una singola figura, su un singolo grafico. – Rook

+0

oh sembra che abbiamo avuto la stessa idea di plotyy e scaling! – Amro

+0

@Amro: la mia idea di ridimensionamento sarebbe stata qualcosa sulla falsariga di dividere tutti i vettori per il loro massimo. Il tuo esempio è abbastanza sofisticato! – mtrw

6

Sono a conoscenza di plotyy che consente di avere due assi y, ma non "plotyyy"!

Forse è possibile normalizzare i valori y per avere la stessa scala (normalizzazione min/max, standardizzazione zscore, ecc.), Quindi è possibile tracciare semplicemente la sequenza usando la normale sequenza plot, hold.

Ecco un esempio:

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

plotyy normalization

10

Una possibilità si può provare è creare 3 assi impilati uno sopra l'altro con le 'Color' proprietà del prime due set di 'none' in modo che tutti i grafici siano visibili. Dovresti regolare la larghezza degli assi, la posizione e i limiti dell'asse x in modo che gli assi 3 y siano affiancati anziché uno sull'altro. Dovresti anche rimuovere i segni di graduazione e le etichette dell'asse x da 2 degli assi poiché si trovano uno sopra l'altro.

Ecco un'implementazione generale che calcola le posizioni adeguate per gli assi e offset per i limiti dell'asse x per mantenere le trame allineati correttamente:

%# 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'); 

ed ecco la figura risultante:

enter image description here

4

I grafici a più scale sono rari da trovare oltre due assi ... Fortunatamente in Matlab è possibile, ma è necessario sovrapporre completamente gli assi e giocare con i segni di graduazione per non nascondere informazioni.

Di seguito è un bel campione di lavoro. Spero che questo sia quello che stai cercando (anche se i colori potrebbero essere più belli)!

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) 

alt text http://www.pablorodriguez.info/wp-content/Multiaxes.png

Problemi correlati