2015-05-12 5 views
9

Ho matrici x1, x2, ... contenenti variabile numero di vettori di riga. faccio successive trameRipristina indice ColorOrder per il tracciamento in Matlab/Octave

figure 
hold all % or hold on 
plot(x1') 
plot(x2') 
plot(x3') 

Matlab o Octave normalmente itera attraverso ColorOrder e tracciare ogni riga di colore diverso. Ma io voglio ogni comando plot per avviare di nuovo con il primo colore colororder, quindi in caso di default il primo vettore di matrice deve essere blu, secondo in verde, terzo in rosso ecc

Purtroppo non riesco a trovare alcuna proprietà correlato all'indice del colore, un altro metodo per resettarlo.

+0

fare tutto il 'matrici x' stampare lo stesso numero di righe? – Dan

+2

quale versione di Matlab usi? Se usi la versione anteriore alla 2014b puoi semplicemente usare 'hold on' invece di' hold all' ... allora tutto il comando 'plot' inizierà all'inizio dell'ordine dei colori. – Hoki

+0

In realtà io uso Octave perché non ho più la licenza Matlab. @Dan Posso immaginare di impostare una mappa di colori corretta, ma sfortunatamente il numero delle linee varia. Questa è la ragione della mia domanda. – Honza

risposta

7

È possibile spostare l'originale ColorOrder in assi di corrente in modo che la nuova trama parte dalla stesso colore:

h=plot(x1'); 
set(gca, 'ColorOrder', circshift(get(gca, 'ColorOrder'), numel(h))) 
plot(x2'); 

si può avvolgere in una funzione:

function h=plotc(X, varargin) 
h=plot(X, varargin{:}); 
set(gca, 'ColorOrder', circshift(get(gca, 'ColorOrder'), numel(h))); 
if nargout==0, 
    clear h 
end 
end 

e chiamare

hold all 
plotc(x1') 
plotc(x2') 
plotc(x3') 
+0

Bella soluzione :) – Honza

2

I found a link dove un ragazzo alla fine risolve questo. Egli usa questo codice:

t = linspace(0,1,lineCount)'; 
s = 1/2 + zeros(lineCount,1); 
v = 0.8*ones(lineCount,1); 
lineColors = colormap(squeeze(hsv2rgb(t,s,v))) 
ax=gca 
ax.ColorOrder = lineColors; 

che dovrebbe funzionare per voi supponendo che ciascuna delle vostre matrici ha lo stesso numero di linee. Se non lo fanno, ho la sensazione che dovresti eseguire il ciclo e tracciare ogni riga separatamente usando lineColors sopra per specificare una tripla RBG per la proprietà 'Color' linespec di plot. Così si potrebbe forse usare una funzione come questa:

function h = plot_colors(X, lineCount, varargin) 

    %// For more control - move these four lines outside of the function and make replace lineCount as a parameter with lineColors 
    t = linspace(0,1,lineCount)';        %//' 
    s = 1/2 + zeros(lineCount,1); 
    v = 0.8*ones(lineCount,1); 
    lineColors = colormap(squeeze(hsv2rgb(t,s,v))); 


    for row = 1:size(X,1) 
     h = plot(X(row, :), 'Color', lineColors(row,:), varargin{:}); %// Assuming I've remembered how to use it correctly, varargin should mean you can still pass in all the normal plot parameters like line width and '-' etc 
     hold on; 
    end 

end 

dove lineCount è il più grande numero di linee tra i tuoi x matrici

2

definire una funzione che intercetta la chiamata a plot e imposta 'ColorOrderIndex' a 1 prima di fare il trama reale.

function plot(varargin) 
if strcmp(class(varargin{1}), 'matlab.graphics.axis.Axes') 
    h = varargin{1}; %// axes are specified 
else 
    h = gca; %// axes are not specified: use current axes 
end 
set(h, 'ColorOrderIndex', 1) %// reset color index 
builtin('plot', (varargin{:})) %// call builtin plot function 

Ho provato questo in Matlab R2014b.

+0

Bella soluzione. Credo che funzionerebbe nell'attuale Matlab ma sfortunatamente Octave non conosce la proprietà 'ColorOrderIndex'. – Honza

+0

Oh. Peccato :-) Non ho accesso a Octave –

1

Se si desidera un approccio line-of-code leggermente inciso, si potrebbe forse traccia un numero appropriato di (0,0) punti alla fine di ogni trama matrice per spingere indietro il tuo colorback all'inizio - è come la soluzione di Mohsen Nosratinia ma meno elegante ...

Supponendo che ci siano sette colori da scorrere attraverso come in mATLAB si potrebbe fare qualcosa di simile

% number of colours in ColorOrder 
nco = 7; 
% plot matrix 1 
plot(x1'); 
% work out how many empty plots are needed and plot them 
nep = nco - mod(size(x1,1), nco); plot(zeros(nep,nep)); 
% plot matrix 2 
plot(x2'); 
... 
% cover up the coloured dots with a black one at the end 
plot(0,0,'k'); 
Problemi correlati