2011-09-06 10 views
6

Cuando configura DefaultAxesColorOrder y DefaultAxesLineStyleOrder MATLAB primero recorrerá todos los colores con el primer estilo, luego nuevamente con todos los colores con el segundo estilo y así sucesivamente.MATLAB: establece el orden de estilo y color de la línea para aplicar en paralelo

Consulte este documentation o related question.

Lo que me gustaría hacer es establecer el orden de los colores y el orden de los estilos para que se apliquen de forma independiente.

Por ejemplo, si fijo DefaultAxesColorOrder-[1 0 0; 0 1 0; 0 0 1] y DefaultAxesLineStyleOrder-'-|--|:', las líneas serán 'r-', 'g-', 'b-', 'r--', 'g--', 'b--', 'r:', 'g:', 'b:'. Quiero que las líneas sean 'r-', 'g--', 'b:'.

Respuesta

4

No veo la manera de hacer esto directamente de fábrica. La forma directa es establecer el color/estilo de forma manual para cada línea.

Aquí hay una solución más automatizada. Vamos a empezar con un ejemplo tomado de la documentación:

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

Como se explica en su pregunta, el comportamiento por defecto es para pasar por los colores en primer lugar, a continuación, los estilos de línea. Si desea aplicar de forma independiente, intente lo siguiente:

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

Puede quizá concluir que, en una función para facilitar el acceso (que todavía tienen que pasar los mangos de las líneas de objetos gráficos):

function applyColorLineStyleIndependently(h) 
    %# ... 
end 

enter image description here

+0

¡Muchas gracias! ¡Es genial! Nunca usé matrices de celdas en 'set'. – yuk

0

El enfoque de Amro funciona bien. Solo como una nota, no tiene que establecer los valores predeterminados para hacer esto. Puede hacer algo como esto

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) 

Editar: la función mycolors() es de fabricación casera. Defino

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

(los nombres de colores son de esta http://www.rapidtables.com/web/color/RGB_Color.htm). Luego los escalo a [0,1] a través de

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

Gracias. ¿Qué es la función mycolors? No lo encontré ni en MATLAB ni en FileExchange. ¿Es tu propio código? – yuk

Cuestiones relacionadas