MATLAB: Establezca el color y el orden de estilo de la línea que se aplicará en paralelo
Pregunta
Cuando te configuras DefaultAxesColorOrder
y DefaultAxesLineStyleOrder
Matlab primero en bicicleta a través de todos los colores con el primer estilo, luego nuevamente a través de todos los colores con el segundo estilo y así sucesivamente.
Mira esto documentación o pregunta relacionada.
Lo que me gustaría hacer es establecer el orden de color y el orden de estilo para aplicarse de forma independiente.
Por ejemplo, si lo configuro DefaultAxesColorOrder
a [1 0 0; 0 1 0; 0 0 1]
y DefaultAxesLineStyleOrder
a '-|--|:'
, las líneas serán 'r-'
,'g-'
,'b-'
,'r--'
,'g--'
,'b--'
,'r:'
,'g:'
,'b:'
. Quiero que las líneas sean 'r-'
,'g--'
,'b:'
.
Solución
No veo una forma de hacer esto directamente de la caja. La forma directa es establecer el color/estilo manualmente para cada línea.
Aquí hay una solución más automatizada. Comencemos 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 explicó en su pregunta, el comportamiento predeterminado es recorrer primero los colores, luego los estilos de línea. Si desea aplicarlos 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))
Tal vez pueda envolver eso en una función para un acceso conveniente (aún tiene que pasar las manijas a los objetos gráficos de las líneas):
function applyColorLineStyleIndependently(h)
%# ...
end
Otros consejos
El enfoque de Amro funciona bien. Solo como nota, no tiene que establecer los valores predeterminados para hacer esto. Puedes 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 () está hecha en casa. Defino
colors.maroon = [128,0,0];
colors.dark_red = [139,0,0];
colors.brown = [165,42,42];
...
(Los nombres de color son de esto http://www.rapidtables.com/web/color/rgb_color.htm). Luego los escala a [0,1] a través de
c = fieldnames(colors);
for i = 1:numel(c)
colors.(c{i}) = colors.(c{i})/255;
end