J'essaie de tracer plusieurs estimations de la densité du noyau sur le même graphique, et je veux qu'elles soient toutes de couleurs différentes. J'ai une solution simplifiée en utilisant une chaîne 'rgbcmyk'
et en la parcourant pour chaque tracé séparé, mais je commence à avoir des doublons après 7 itérations. Existe-t-il un moyen plus simple/plus efficace de le faire et avec plus d'options de couleurs?
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
Vous pouvez utiliser une palette de couleurs telle 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
MATLAB a 13 listes de couleurs nommées différentes ( 'doc colormap' les répertorie toutes).
Une autre option pour tracer des lignes de différentes couleurs consiste à utiliser la propriété LineStyleOrder ; voir Définition de la couleur des lignes pour le traçage dans la documentation MATLAB pour plus d'informations.
En fait, une méthode de raccourci décente pour obtenir le cycle de couleurs consiste à utiliser hold all;
à la place de hold on;
. Chaque plot
successif fera pivoter (automatiquement pour vous) la palette de couleurs par défaut de MATLAB.
Depuis le site MATLAB sur hold
:
hold all
contient le tracé et la couleur et le style de ligne actuels, de sorte que les commandes de tracé suivantes ne réinitialisent pas les valeurs des propriétés ColorOrder et LineStyleOrder au début de la liste. Les commandes de tracé continuent de parcourir les couleurs et styles de trait prédéfinis à partir de l'endroit où le dernier tracé s'est arrêté dans la liste.
Réponse tardive, mais deux choses à ajouter:
'ColorOrder'
et sur la définition d'une valeur globale par défaut avec 'DefaultAxesColorOrder'
, voir "Annexe" au bas de cet article.La propriété ColorOrder
axes
permet à MATLAB de parcourir automatiquement une liste de couleurs lorsqu’on utilise hold on/all
(voir l’appendice ci-dessous pour savoir comment set
/get
le ColorOrder
pour un axe spécifique ou global via DefaultAxesColorOrder
). Cependant, par défaut , MATLAB ne spécifie qu'une courte liste de couleurs ( seulement 7 à partir de R2013b) pour parcourir, et d'autre part, il peut être problématique de trouver un bon jeu de couleurs pour plus de séries de données. Pour 10 tracés, vous ne pouvez évidemment pas vous fier à la valeur par défaut ColorOrder
.
Un excellent moyen de définir N couleurs visuellement distinctes consiste à utiliser la présentation "Générer des couleurs extrêmement distinctes sur le plan de la perception" (GMPDC) sur MATLAB Central. Échange de fichiers . Le mieux est décrit dans les propres mots de l'auteur:
Cette fonction génère un ensemble de couleurs qui peuvent être distinguées par référence à l'espace espace colorimétrique "Lab" , qui correspond plus étroitement à la perception des couleurs par l'homme que le mode RVB. À partir d’une grande liste initiale de couleurs possibles, il choisit de manière itérative l’entrée de la liste la plus éloignée (dans l’espace Lab) de toutes les entrées précédemment choisies.
Par exemple, lorsque 25 couleurs sont demandées:
La soumission GMPDC a été choisie sur le blog officiel de MathWorks comme Choix de la semaine en 2010, en partie en raison de la possibilité de demander un nombre arbitraire de couleurs (contrairement aux 7 couleurs par défaut de MATLAB). Ils ont même formulé l’excellente suggestion consistant à définir ColorOrder
de MATLAB au démarrage sur,
distinguishable_colors(20)
Bien sûr, vous pouvez définir la variable ColorOrder
pour un seul axe ou simplement générer une liste de couleurs à utiliser comme bon vous semble. Par exemple, pour générer 10 "couleurs parfaitement distinctes au niveau de la perception" et les utiliser pour 10 tracés sur le même axe ( mais sans utiliser ColorOrder
, nécessitant ainsi 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é et ne nécessite aucune boucle for
, avec la propriété d'axe ColorOrder
:
% X de taille N par P par 2 Mpdc10 = couleurs distinguables (10) Ha = axes; tenir (ha, 'sur') ensemble (ha, 'ColorOrder', mpdc10)% --- définir ColorOrder ICI --- parcelle (X (:,:, 1), X (:,:, 2), '-.')% boucle NON nécessaire, 'Couleur' non nécessaire. Yay!
ANNEXE
Pour obtenir le tableau RVB ColorOrder
utilisé pour l’axe actuel,
get(gca,'ColorOrder')
Pour obtenir la valeur par défaut ColorOrder
pour les nouveaux axes,
get(0,'DefaultAxesColorOrder')
Exemple de définition de la nouvelle variable globale ColorOrder
avec 10 couleurs au début de MATLAB, dans startup.m
:
set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
En retard à la fête. J'examinais moi-même et venais de trouver à propos de cette option d'axes appelée ColorOrder vous pouvez spécifier l'ordre des couleurs pour la session ou juste pour la figure, puis tracer un tableau et laisser MATLAB parcourir les couleurs spécifiées automatiquement.
voir Changer le ColorOrder par défaut
exemple
set(0,'DefaultAxesColorOrder',jet(5))
A=Rand(10,5);
plot(A);
Si tous les vecteurs ont la même taille, créez une matrice et tracez-la. Chaque colonne est automatiquement tracée avec une couleur différente. Vous pouvez ensuite utiliser legend
pour indiquer les 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)