Traccia automaticamente diverse linee colorate


112

Sto cercando di tracciare diverse stime della densità del kernel sullo stesso grafico e voglio che siano tutte di colori diversi. Ho una soluzione sbagliata usando una stringa 'rgbcmyk'e la passo attraverso per ogni trama separata, ma inizio ad avere duplicati dopo 7 iterazioni. C'è un modo più semplice / più efficiente per farlo 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

30
Hai provato semplicemente a fare "tieni tutto"? Questo disegna automaticamente i colori delle notizie per ogni nuovo comando di trama.
twerdster

3
"tieni tutto" non è una risposta alla domanda reale, ma può essere una soluzione per molte persone che finiscono qui perché un semplice "trattenere" disegna tutte le curve in blu. Molte grazie a @twerdster!
Rémi

8
A partire da R2014b , il solito hold onè funzionalmente equivalente a hold all. Tuttavia, rimane la domanda su come ottenere più dei 7 colori predefiniti. Una mappa dei colori predefinita può essere una soluzione come descritto da Azim o può essere utilizzata una funzione per generare colori ottimizzati per una facile discriminazione visiva, come di seguito .
chappjc

1
Quando lo uso hold allottengo trame in diversi colori (anche se devo dire che sembrano piuttosto spenti), mentre quando lo uso hold ontutte le mie trame diventano blu. Quindi mi chiedo cosa sia l'equivalenza funzionale.
Ciao arrivederci

4
@HelloGoodbye In R2014b e versioni successive, hold onfornisce diversi grafici a colori. Stai utilizzando una versione precedente. Dalla documentazione corrente , " hold allè uguale a hold on. Nota: questa sintassi verrà rimossa in una versione futura. Utilizza hold oninvece". Vedi anche le note sulla versione .
chappjc

Risposte:


131

È possibile utilizzare una mappa di colori come HSV per generare un set di colori. Per esempio:

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

MATLAB ha 13 mappe di colori con nome diverso ( 'doc colormap' le elenca tutte).

Un'altra opzione per tracciare linee con colori diversi consiste nell'usare la proprietà LineStyleOrder ; vedere Definizione del colore delle linee per la stampa nella documentazione MATLAB per maggiori informazioni.


Lo stavo cercando. Stai bene @ Azim.
professore

Per i posteri, ho scelto di accettare questa risposta rispetto alla hold allsoluzione di @Mark Elliot per la sua versatilità di poter scegliere diverse mappe di colori.
Doresoom

Come posso farlo funzionare usando il comando "line" plot invece di plot?
Pedro77

106

In realtà, un metodo di scelta rapida decente per far scorrere i colori è usare hold all;al posto di hold on;. Ogni successivo plotruoterà (automaticamente per te) attraverso la mappa dei colori predefinita di MATLAB.

Dal sito MATLAB su hold:

hold allcontiene il grafico e il colore e lo stile della linea correnti in modo che i successivi comandi di stampa non ripristinino i valori delle proprietà ColorOrder e LineStyleOrder all'inizio dell'elenco. I comandi di stampa continuano a scorrere i colori e gli stili di linea predefiniti dal punto in cui si è interrotto l'ultimo grafico nell'elenco.


36

Risposta tardiva, ma due cose da aggiungere:

  • Per informazioni su come modificare la 'ColorOrder'proprietà e come impostare un valore predefinito globale con 'DefaultAxesColorOrder', vedere l '"Appendice" in fondo a questo post.
  • C'è un ottimo strumento in MATLAB Central File Exchange per generare un numero qualsiasi di colori visivamente distinti, se hai il Toolbox di elaborazione delle immagini per usarlo. Continua a leggere per i dettagli.

La ColorOrder axesproprietà permette di MATLAB per passare automaticamente attraverso una lista di colori quando si utilizzano hold on/all(ancora una volta, si veda l'Appendice sotto per sapere come set/ getla ColorOrderper un asse specifico o globalmente via DefaultAxesColorOrder). Tuttavia, per impostazione predefinita MATLAB specifica solo un breve elenco di colori ( solo 7 a partire da R2013b) da scorrere, e d'altra parte può essere problematico trovare un buon set di colori per più serie di dati. Per 10 lotti, ovviamente non puoi fare affidamento sul valore predefinito ColorOrder.

Un ottimo modo per definire N colori visivamente distinti è con l' invio "Generate Maximally Perceptually-Distinct Colors" (GMPDC) su MATLAB Central File Exchange . È meglio descritto con le parole dell'autore:

Questa funzione genera un insieme di colori che sono distinguibili in riferimento allo spazio colore "Lab" , che corrisponde più da vicino alla percezione del colore umano rispetto a RGB. Dato un ampio elenco iniziale di possibili colori, sceglie iterativamente la voce nell'elenco più lontana (nello spazio Lab) da tutte le voci scelte in precedenza.

Ad esempio, quando sono richiesti 25 colori:

25 "colori percettivamente distinti al massimo"

La presentazione GMPDC è stata scelta sul blog ufficiale di MathWorks come Scelta della settimana nel 2010 in parte a causa della possibilità di richiedere un numero arbitrario di colori (in contrasto con i 7 colori predefiniti di MATLAB). Hanno anche dato l'eccellente suggerimento di impostare MATLAB ColorOrderall'avvio su,

distinguishable_colors(20)

Naturalmente, puoi impostare il ColorOrderper un singolo asse o semplicemente generare un elenco di colori da utilizzare nel modo che preferisci. Ad esempio, per generare 10 "colori percettivamente distinti al massimo" e usarli per 10 grafici sullo stesso asse ( ma non utilizzando ColorOrder, richiedendo quindi 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 è semplificato, non richiede forloop, con la ColorOrderproprietà axis :

% X di dimensione N per P per 2
mpdc10 = distinguishable_colors (10)
ha = assi; hold (ha, 'on')
set (ha, 'ColorOrder', mpdc10)% --- set ColorOrder QUI ---
plot (X (:,:, 1), X (:,:, 2), '-.')% loop NON necessario, 'Color' NON necessario. Sìì!

APPENDICE

Per ottenere l' ColorOrderarray RGB utilizzato per l'asse corrente,

get(gca,'ColorOrder')

Per ottenere l'impostazione predefinita ColorOrderper i nuovi assi,

get(0,'DefaultAxesColorOrder')

Esempio di impostazione di un nuovo globale ColorOrdercon 10 colori all'avvio di MATLAB, in startup.m:

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

2
Solo una nota, questo sembra richiedere il Toolbox di elaborazione delle immagini.
Doresoom

2
@ Doresoom Grazie per le informazioni. Ho aggiornato il post.
chappjc

12

In ritardo alla festa. Lo stavo esaminando da solo e ho appena scoperto che questa opzione degli assi chiamata ColorOrder è possibile specificare l'ordine dei colori per la sessione o solo per la figura, quindi tracciare un array e lasciare che MATLAB scorra automaticamente tra i colori specificati.

vedere Modifica del ColorOrder predefinito

esempio

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

1
Per un asse una tantum:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev

1
eccellente solo per informare sul jet (numero) che non richiede alcuna
cassetta degli

4

Se tutti i vettori hanno la stessa dimensione, creare una matrice e tracciarla. Ogni colonna viene tracciata automaticamente con un colore diverso, quindi puoi utilizzare legendper indicare le colonne:

data = randn(100, 5);

figure;
plot(data);

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

Oppure, se hai una cella con nomi di kernel, usa

legend(names)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.