Tracez automatiquement différentes lignes colorées

112

J'essaie de tracer plusieurs estimations de densité de noyau sur le même graphique, et je veux qu'elles soient toutes de couleurs différentes. J'ai une solution kludged utilisant une chaîne 'rgbcmyk'et 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 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
Doresoom
la source
30
Avez-vous simplement essayé de "tenir tout"? Cela dessine automatiquement les nouvelles couleurs pour chaque nouvelle commande de tracé.
twerdster
3
"tenir tout" n'est pas une réponse à la question réelle, mais peut être une solution pour beaucoup de gens qui se terminent ici parce qu'un simple "accroche" dessine toutes les courbes en bleu. Merci beaucoup à @twerdster!
Rémi
8
Depuis R2014b , l'habituel hold onest fonctionnellement équivalent à hold all. Cependant, la question de savoir comment obtenir plus que les 7 couleurs par défaut demeure. Une carte de couleurs par défaut peut être une solution telle que décrite par Azim ou une fonction pour générer des couleurs réglées pour une discrimination visuelle facile peut être utilisée, comme ci-dessous .
chappjc
1
Lorsque j'utilise, hold allj'obtiens des tracés de différentes couleurs (même si je dois dire qu'ils ont l'air assez terne), alors que lorsque j'utilise hold on, tous mes tracés deviennent bleus. Je me demande donc ce qu'est l'équivalence fonctionnelle.
HelloGoodbye
4
@HelloGoodbye Dans R2014b et plus récent, hold ondonne des tracés de couleurs différents. Vous utilisez une version plus ancienne. Dans la documentation actuelle , " hold allest identique à hold on. Remarque: Cette syntaxe sera supprimée dans une prochaine version. Utilisez-la à la hold onplace." Voir également les notes de version .
chappjc

Réponses:

131

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 couleurs différentes nommées ( 'doc colormap' 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 tracé dans la documentation MATLAB pour plus d'informations.

Azim
la source
Je le cherchais. Soyez bien @Azim.
professeur
Pour la postérité, j'ai choisi d'accepter cette réponse plutôt que la hold allsolution de @Mark Elliot en raison de sa polyvalence de pouvoir choisir différentes cartes de couleurs.
Doresoom
Comment puis-je le faire fonctionner en utilisant la commande "line" plot au lieu de plot?
Pedro77
106

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

Depuis le site MATLAB sur hold:

hold allcontient le tracé et la couleur et le style de ligne actuels afin que les commandes de traçage suivantes ne réinitialisent pas les valeurs des propriétés ColorOrder et LineStyleOrder au début de la liste. Les commandes de traçage continuent de parcourir les couleurs et les styles de lignes prédéfinis à partir de l’endroit où le dernier tracé s’est arrêté dans la liste.

Mark Elliot
la source
36

Réponse tardive, mais deux choses à ajouter:

  • Pour plus d'informations sur la modification de la 'ColorOrder'propriété et sur la définition d'une valeur par défaut globale avec'DefaultAxesColorOrder' , consultez l '«Annexe» au bas de cet article.
  • Il existe un excellent outil sur l'échange central de fichiers MATLAB pour générer n'importe quel nombre de couleurs visuellement distinctes, si vous disposez de la boîte à outils de traitement d'image pour l'utiliser. Lisez la suite pour plus de détails.

La ColorOrder axespropriété permet à MATLAB de faire défiler automatiquement une liste de couleurs lors de l'utilisation hold on/all(encore une fois, voir l'annexe ci-dessous pour savoir comment set/ getle ColorOrderpour un axe spécifique ou globalement via DefaultAxesColorOrder). Cependant, par défaut, MATLAB ne spécifie qu'une courte liste de couleurs ( seulement 7 à partir de R2013b) à parcourir, et d'un autre côté, il peut être problématique de trouver un bon ensemble de couleurs pour plus de séries de données. Pour 10 parcelles, vous ne pouvez évidemment pas vous fier à la valeur par défaut ColorOrder.

Une excellente façon de définir N couleurs visuellement distinctes consiste à soumettre la soumission «Générer des couleurs distinctes au maximum de la perception» (GMPDC) sur MATLAB Central File Exchange . Il est mieux décrit dans les propres mots de l'auteur:

Cette fonction génère un ensemble de couleurs qui se distinguent par référence à l' espace colorimétrique "Lab" , qui correspond plus étroitement à la perception humaine des couleurs que RVB. Étant donné une grande liste initiale de couleurs possibles, il choisit de manière itérative l'entrée dans la liste qui est 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 "couleurs perceptuellement distinctes au maximum"

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 fait l'excellente suggestion de régler MATLAB ColorOrderau démarrage sur,

distinguishable_colors(20)

Bien sûr, vous pouvez définir le ColorOrderpour un seul axe ou simplement générer une liste de couleurs à utiliser comme vous le souhaitez. Par exemple, pour générer 10 "couleurs perceptuellement distinctes au maximum" et les utiliser pour 10 tracés sur le même axe ( mais sans utiliser 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 aucune forboucle, avec la ColorOrderpropriété axis :

% X de la taille N-par-P-par-2
mpdc10 = couleurs_distribuables (10)
ha = axes; tenir (ha, 'on')
set (ha, 'ColorOrder', mpdc10)% --- set ColorOrder ICI ---
plot (X (:,:, 1), X (:,:, 2), '-.')% boucle NON nécessaire, 'Couleur' ​​NON nécessaire. Yay!

APPENDICE

Pour obtenir le ColorOrdertableau RVB utilisé pour l'axe actuel,

get(gca,'ColorOrder')

Pour obtenir la valeur ColorOrderpar défaut des nouveaux axes,

get(0,'DefaultAxesColorOrder')

Exemple de paramétrage de nouveau global ColorOrderavec 10 couleurs au démarrage de MATLAB, en startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
chappjc
la source
2
Juste une note, cela semble nécessiter la boîte à outils de traitement d'image.
Doresoom
2
@Doresoom Merci pour l'info. J'ai mis à jour le message.
chappjc
12

En retard à la fête. J'étais en train de regarder cela moi-même et je viens de trouver à propos de cette option d'axes appelée ColorOrder.Vous pouvez spécifier l'ordre des couleurs pour la session ou simplement pour la figure, puis simplement tracer un tableau et laisser MATLAB parcourir automatiquement les couleurs spécifiées.

voir Modification de la couleur par défaut

exemple

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
xquared
la source
1
Pour un axe ponctuel:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev
1
excellent juste pour informer sur le jet (nombre) qui ne nécessite aucune
boîte à
4

Si tous les vecteurs ont la même taille, créez une matrice et tracez-la. Chaque colonne est tracée automatiquement avec une couleur différente.Vous pouvez ensuite utiliser legendpour 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)
Serg
la source