Domanda

Sto cercando di tracciare diverse stime di densità kernel sullo stesso grafico, e li voglio tutti essere diversi colori. Ho una soluzione kludged utilizzando un 'rgbcmyk' stringa e passando attraverso di essa per ogni terreno separato, ma avente inizio duplicati dopo 7 iterazioni. C'è un / modo più efficiente semplice per fare questo, e con più opzioni di colore?

for n=1:10
 source(n).data=normrnd(rand()*100,abs(rand()*50),100,1); %generate random data
end
cstring='rgbcmyk'; % color string
figure
hold on
for n=1:length(source)
 [f,x]=ksdensity(source(n).data); % calculate the distribution
 plot(x,f,cstring(mod(n,7)+1))  % plot with a different color each time
end
È stato utile?

Soluzione

È possibile utilizzare un mappa dei colori, come HSV per generare un insieme di colori. Ad esempio:

cc=hsv(12);
figure; 
hold on;
for i=1:12
    plot([0 1],[0 i],'color',cc(i,:));
end

MATLAB dispone di 13 differenti mappe di colore di nome ( 'doc colormap' di loro tutte le liste).

Un'altra opzione per tracciare le linee in diversi colori è quello di utilizzare il LineStyleOrder di proprietà; vedi Definire il colore delle linee per tracciare i nella documentazione MATLAB per ulteriori informazioni.

Altri suggerimenti

In realtà, un metodo di collegamento decente per ottenere i colori per ciclo è quello di utilizzare hold all; al posto di hold on;. Ogni plot successiva ruoterà (automaticamente per voi) attraverso la mappa di colori di default di MATLAB.

Dal sito MATLAB su hold :

  

hold all detiene la trama e l'attuale colore della linea e la linea di stile in modo che i successivi comandi di tracciato non ripristinati i valori delle proprietà ColorOrder e LineStyleOrder all'inizio della lista. comandi plottaggio continuare a pedalare attraverso i colori predefiniti e stili linea dal punto in cui l'ultimo lotto fermato nella lista.

risposta in ritardo, ma due cose da aggiungere:

  • Per informazioni su come modificare la proprietà 'ColorOrder' e come impostare un default globale con 'DefaultAxesColorOrder', consultare la "Appendice" in fondo a questo post.
  • V'è un grande strumento sul MATLAB Central File Exchange per generare qualsiasi numero di colori distinti visivamente, se avete l'Image Processing Toolbox per usarlo. Continua a leggere per i dettagli.

Il href="http://www.mathworks.com/help/matlab/ref/axes_props.html#ColorOrder"> proprietà ColorOrder axes permette MATLAB per passare automaticamente attraverso una lista di colori quando utilizzando hold on/all (di nuovo, si veda l'Appendice sotto per come set / get la ColorOrder per un asse specifico o globalmente tramite DefaultAxesColorOrder). Tuttavia, per impostazione predefinita MATLAB specifica solo un breve elenco di colori ( solo 7 come di R2013b) per scorrere, e d'altra parte può essere problematico trovare un buon set di colori per più serie di dati. Per 10 appezzamenti, ovviamente non si può fare affidamento sul ColorOrder di default.

Un ottimo modo per definire N visivamente colori distinti è la " Generate al massimo percettivo-distinta Colori (GMPDC) presentazione sul MATLAB file centrale Scambio File ". E 'meglio descritta con le parole stesse dell'autore:

  

Questa funzione genera un insieme di colori che sono distinguibili in base alla "Lab" spazio colore, che più strettamente partite percezione umana del colore da RGB. Dato un grande elenco iniziale di colori possibili, sceglie in modo iterativo la voce nell'elenco che è più lontano (nello spazio Lab) da tutte le voci precedentemente selezionate.

Per esempio, quando vengono richiesti 25 colori:

25 "colori al massimo percettivamente-distinti"

La presentazione GMPDC è stato scelto il blog ufficiale MathWorks come pick of the Week nel 2010 in parte a causa della possibilità di richiedere un numero arbitrario di colori (a differenza di MATLAB costruita in 7 colori predefiniti). Ci hanno anche fatto l'ottimo suggerimento per impostare ColorOrder di MATLAB all'avvio a,

distinguishable_colors(20)

Naturalmente, è possibile impostare il ColorOrder per un singolo asse o semplicemente generare un elenco di colori da utilizzare in qualsiasi modo tu voglia. Ad esempio, per generare 10 "colori massimamente percettivamente-distinti" e utilizzarli per 10 trame sullo stesso asse ( ma non utilizzando ColorOrder, richiedendo così un ciclo ):

% Starting with X of size N-by-P-by-2, where P is number of plots
mpdc10 = distinguishable_colors(10) % 10x3 color list
hold on
for ii=1:size(X,2),
    plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:));
end

Il processo viene semplificato, richiede alcun loop for, con la struttura asse ColorOrder :

% X of size N-by-P-by-2
mpdc10 = distinguishable_colors(10)
ha = axes; hold(ha,'on')
set(ha,'ColorOrder',mpdc10)    % --- set ColorOrder HERE ---
plot(X(:,:,1),X(:,:,2),'-.')   % loop NOT needed, 'Color' NOT needed. Yay!

APPENDICE

Per ottenere ColorOrder matrice RGB utilizzato per l'asse corrente,

get(gca,'ColorOrder')

Per ottenere il ColorOrder predefinita per i nuovi assi,

get(0,'DefaultAxesColorOrder')

Esempio di impostazione nuova ColorOrder globale con 10 colori di inizio MATLAB, in startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))

in ritardo alla festa. Ero alla ricerca in questo me stesso e appena trovato su questo assi un'opzione chiamata ColorOrder è possibile specificare l'ordine dei colori per la sessione o solo per la figura e poi basta tracciare un array e lasciare che MATLAB ciclo automaticamente attraverso i colori specificati.

Modifica dei valori predefiniti ColorOrder

Esempio

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);

Se tutti i vettori hanno pari dimensioni, creare una matrice e tracciare esso. Ogni colonna è tracciata con un colore diverso automaticamente Quindi è possibile utilizzare legend per indicare le colonne:

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))

In alternativa, se si dispone di una cella con nomi kernel, utilizzare

legend(names)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top