web-dev-qa-db-fra.com

Tracer automatiquement différentes lignes de couleur

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
107
Doresoom

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.

130
Azim

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.

106
Mark Elliot

Réponse tardive, mais deux choses à ajouter:

  • Pour plus d'informations sur la modification de la propriété 'ColorOrder' et sur la définition d'une valeur globale par défaut avec 'DefaultAxesColorOrder', voir "Annexe" au bas de cet article.
  • MATLAB Central File Exchange est un excellent outil pour générer un nombre illimité de couleurs visuellement distinctes, si vous disposez de la boîte à outils Traitement d'image pour l'utiliser. Lisez la suite pour plus de détails.

La propriété ColorOrderaxes 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:

25 "maximally perceptually-distinct colors"

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))
36
chappjc

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);
12
xquared

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)
4
Serg