MATLAB: il colore della linea set e l'ordine di stile da applicare in parallelo
Domanda
Quando si imposta DefaultAxesColorOrder
e DefaultAxesLineStyleOrder
MATLAB primo ciclo attraverso tutti i colori con il primo stile, poi di nuovo con tutti i colori con il secondo stile e così via.
documentazione o related domanda .
Quello che vorrei fare è di ordine dei colori insieme e l'ordine di stile da applicare in modo indipendente.
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 linee da 'r-'
, 'g--'
, 'b:'
.
Soluzione
Non vedo un modo per farlo direttamente fuori dalla scatola. Il modo più semplice è quello di impostare manualmente il colore / 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 lei ha 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))
È possibile 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
Altri suggerimenti
L'approccio di Amro funziona bene. Proprio come una nota, non è necessario impostare i valori predefiniti per fare questo. Si può fare qualcosa di simile
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 dei Mycolors () è fatto in casa. Definisco
colors.maroon = [128,0,0];
colors.dark_red = [139,0,0];
colors.brown = [165,42,42];
...
(i nomi dei colori sono da questo http://www.rapidtables.com/web /color/RGB_Color.htm ). Poi li ho scalabili in [0,1] tramite
c = fieldnames(colors);
for i = 1:numel(c)
colors.(c{i}) = colors.(c{i})/255;
end