2011-09-06 10 views
6

Quando si imposta DefaultAxesColorOrder e DefaultAxesLineStyleOrder MATLAB esegue dapprima un ciclo di tutti i colori con il primo stile, quindi di nuovo tutti i colori con il secondo stile e così via.MATLAB: imposta il colore e l'ordine di stile della linea da applicare in parallelo

Vedere questo documentation o related question.

Quello che mi piacerebbe fare è impostare l'ordine dei colori e l'ordine degli stili da applicare indipendentemente.

Ad esempio, se regolo DefaultAxesColorOrder a [1 0 0; 0 1 0; 0 0 1] e DefaultAxesLineStyleOrder a '-|--|:', le linee saranno 'r-', 'g-', 'b-', 'r--', 'g--', 'b--', 'r:', 'g:', 'b:'. Voglio che le linee siano 'r-', 'g--', 'b:'.

risposta

4

Non vedo un modo per farlo direttamente fuori dalla scatola. Il modo semplice è impostare manualmente il colore/lo stile per ogni linea.

Ecco una soluzione più automatizzata. Cominciamo con un esempio tratto dalla documentazione:

%# defaults are set sometime before 
set(0, 'DefaultAxesColorOrder',[1 0 0;0 1 0;0 0 1], ... 
     'DefaultAxesLineStyleOrder','-|--|:') 

%# do plotting as usual 
t = 0:pi/20:2*pi; 
a = zeros(length(t),9); 
for i = 1:9 
    a(:,i) = sin(t-i/5)'; 
end 
h = plot(t,a); 

Come spiegato nella sua interrogazione, il comportamento predefinito è quello di passare in rassegna i colori, poi gli stili di linea. Se si desidera applicare in modo indipendente, provare quanto segue:

c = num2cell(get(0,'DefaultAxesColorOrder'),2); 
l = cellstr(get(0,'DefaultAxesLineStyleOrder')); 
set(h, {'Color'}, c(rem((1:numel(h))-1,numel(c))+1), ... 
    {'LineStyle'}, l(rem((1:numel(h))-1,numel(l))+1)) 

Si può forse avvolgere che in una funzione per un comodo accesso (si devono ancora passare le maniglie per le linee di oggetti grafici):

function applyColorLineStyleIndependently(h) 
    %# ... 
end 

enter image description here

+0

Grazie mille! È ottimo! Non ho mai usato gli array di celle in 'set'. – yuk

0

approccio di Amro funziona bene. Come nota, non è necessario impostare i valori predefiniti per farlo. Puoi fare qualcosa del genere

col = mycolors(); % defines RGB colors scaled to [0,1] 

i = 1; 
c(:,i) = col.royal_blue; i = i+1; 
c(:,i) = col.crimson; i = i+1; 
c(:,i) = col.medium_sea_green; i = i+1; 
c(:,i) = col.coral; i = i+1; 
c(:,i) = col.dark_magenta; i = i+1; 

colord = num2cell(c',2); 
lineord = {'-' '--' '-.'}'; 

set(h,{'Color'}, colord(rem((1:numel(h))-1,numel(colord))+1), ... 
     {'LineStyle'}, lineord(rem((1:numel(h))-1,numel(lineord))+1)) 
set(h,'LineWidth',2) 

Modifica: la funzione mycolors() è fatta in casa. Mi definisco

colors.maroon = [128,0,0]; 
colors.dark_red = [139,0,0]; 
colors.brown = [165,42,42]; 
... 

(i nomi dei colori sono da questa http://www.rapidtables.com/web/color/RGB_Color.htm). Poi li ridimensiono a [0,1] tramite

c = fieldnames(colors); 
for i = 1:numel(c) 
    colors.(c{i}) = colors.(c{i})/255; 
end 
+0

Grazie. Cosa funziona mycolors? Non l'ho trovato né in MATLAB o FileExchange. È il tuo codice? – yuk

Problemi correlati