Question

Je suis en train de tracer plusieurs estimations de densité du noyau sur le même graphique, et je les veux tous être des couleurs différentes. J'ai une solution kludged en utilisant un 'rgbcmyk' à cordes et à travers elle pour marcher chaque parcelle séparée, mais je commence à avoir des doublons après 7 itérations. Y at-il un moyen plus facile / plus efficace de le faire, et avec plus d'options de couleur?

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
Était-ce utile?

La solution

Vous pouvez utiliser une palette de couleurs tels que HSV pour générer un ensemble de couleurs. Par exemple:

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

a 13 Matlab différentes palettes de couleurs nommées ( 'doc colormap' les listes tous).

Une autre option pour tracer des lignes de couleurs différentes est d'utiliser le LineStyleOrder propriété; voir Définir la couleur des lignes pour Traçage dans la documentation pour Matlab plus d'informations.

Autres conseils

En fait, une méthode de raccourci décent pour obtenir les couleurs du cycle est d'utiliser hold all; en place de hold on;. Chaque plot successive tournera (automatiquement pour vous) à travers la palette de couleurs par défaut de Matlab.

Sur le site hold :

  

hold all détient la parcelle et la couleur de la ligne actuelle et style de ligne afin que les commandes ultérieures ne complotent pas remis à zéro les valeurs de propriété ColorOrder et LineStyleOrder au début de la liste. commandes complotant continuent à vélo à travers les couleurs et les styles de ligne prédéfinies d'où la dernière parcelle arrêté dans la liste.

réponse tardive, mais deux choses à ajouter:

  • Pour plus d'informations sur la façon de changer la propriété 'ColorOrder' et comment définir une valeur par défaut globale avec 'DefaultAxesColorOrder', voir « Annexe » au bas de cet article.
  • Il est un excellent outil sur le Matlab échange de fichiers central pour générer un nombre quelconque de couleurs visuellement distinctes, si vous avez le traitement d'image Boîte à outils pour l'utiliser. Poursuivez votre lecture pour.

Le propriété ColorOrder de axes permet Matlab pour faire défiler automatiquement une liste de couleurs lorsque en utilisant hold on/all (encore une fois, voir l'annexe ci-dessous pour savoir comment set / get l'ColorOrder pour un axe spécifique ou globalement via DefaultAxesColorOrder). Toutefois, par défaut Matlab spécifie uniquement une courte liste de couleurs ( seulement 7 au R2013b ) pour faire défiler, et d'autre part, il peut être problématique de trouver un bon un ensemble de couleurs pour plusieurs séries de données. 10 parcelles, vous pouvez évidemment pas compter sur la ColorOrder par défaut.

Une excellente façon de définir N couleurs distinctes visuellement est le « Lab » espace couleur , qui plus étroitement correspond à la perception humaine de la couleur que RVB. Étant donné une liste initiale importante de couleurs possibles, il choisit itérativement l'entrée dans la liste qui est le plus éloigné (dans l'espace Lab) de toutes les entrées précédemment choisies.

Par exemple, lorsque 25 couleurs sont demandées:

'25 couleurs au maximum perceptuels distincts

La présentation CDAGM a été choisi sur le blog officiel de MathWorks comme pick of semaine en 2010 en partie à cause de la possibilité de demander un nombre arbitraire de couleurs (contrairement à Matlab est construit en 7 couleurs par défaut). Ils ont même fait l'excellente suggestion de mettre la ColorOrder de Matlab au démarrage à,

distinguishable_colors(20)

Bien sûr, vous pouvez définir le ColorOrder pour un seul axe ou simplement générer une liste de couleurs à utiliser de quelque façon que vous le souhaitez. Par exemple, pour générer 10 « au maximum les couleurs perceptuels distinctes » et les utiliser pour 10 parcelles sur le même axe ( mais pas en utilisant ColorOrder, ce qui nécessite une boucle ):

% 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

Le processus est simplifié, ne nécessitant pas de boucle de for, avec la propriété de l'axe 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!

ANNEXE

Pour obtenir le tableau ColorOrder RVB utilisé pour l'axe courant,

get(gca,'ColorOrder')

Pour obtenir le ColorOrder par défaut pour les nouveaux axes,

get(0,'DefaultAxesColorOrder')

Exemple de réglage nouveau ColorOrder global avec 10 couleurs au démarrage Matlab, en startup.m:

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

fin à la partie. Je regardais dans moi-même et viens de découvrir sur ce axes option appelée ColorOrder vous pouvez spécifier l'ordre des couleurs pour la session ou juste pour la figure et puis juste tracer un tableau et laisser défiler automatiquement à travers les couleurs Matlab spécifié.

voir Modification de la valeur par défaut ColorOrder

exemple

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

Si tous les vecteurs ont une taille égale, créer une matrice et le tracer. Chaque colonne est tracée avec une couleur différente automatiquement Ensuite, vous pouvez utiliser legend pour indiquer colonnes:

data = randn(100, 5);

figure;
plot(data);

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

Ou, si vous avez une cellule avec des noms de noyaux, utilisez

legend(names)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top