IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Auto-incrémentation de couleur sur graphique


Sujet :

MATLAB

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut Auto-incrémentation de couleur sur graphique
    Bonjour à tous,

    J'ai une question consernant matlab, sur les graphiques comme annoncé dans le titre.

    Comme vous le savez, il est possible d'incrémenter les couleur en RGB dans matlab, très pratique sur une boucle quand on veut ploter plein de trucs en même temps. Le soucis avec la boucle étant qu'elle peut prendre un max de temps, hélas.

    Ma question est donc la suivante : peut-on devenir indépendant de cette boucle?

    Traduction : dans mon script, j'utilise un plot de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(Y1(:,1:end),Y2(:,1:end),'.','color','b','MarkerSize',7);
    Premier constat avec ce plot, matlab comprend bien qu'il sagit de ploter Y1(:,1) Y2(:,1), ... , Y1(:,end) Y2(:,end). Pas de soucis là dessus, et ce fut d'ailleurs une agréable surprise pour moi de voir que cela marchait.

    Cependant, maintenant, je souhaiterai passer ce plot sous la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(Y1(:,1:end),Y2(:,1:end),'.','color',color(:,1:end),'MarkerSize',7);
    Où le tableau color est un tableau définit comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for k=1:N
        color(:,k)=[k/((N+1)) k/((N+1)) 0.5];
    end
    Et de même nombre de colonnes que Y1 et Y2. Normalement il n'y a donc pas de problèmes liés aux dimensions de tableau.

    Cependant, en introduisant donc la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(Y1(:,1:end),Y2(:,1:end),'.','color',color(:,1:end),'MarkerSize',7);
    Soit un plot en couleur variable au lieu de fixe, matlab me renvoi l'erreur suivante :
    ??? Error using ==> plot
    Color value must be a 3 element numeric vector
    Cela signifiant donc qu'il n'arrive pas à lire colonne à colonne les éléments du tableau color contrairement à ceux d'Y1 et Y2.

    Quelqu'un aurait-il une idée de comment contourner le problème?

    Merci d'avance,

    Marlan

    PS : il n'est malheureusement pas envisageable de recourir à une syntaxe du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    figure;
    hold on
    for k=1:N;
    plot(Y1(:,k),Y2(:,k),'color',color(:,k))
    end
    du fait du trop grand nombre d'éléments contenu dans N.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    normalement matlab incrémente automatiquement les couleurs quand tu fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(Y1(:,1:end),Y2(:,1:end),'.','color',color(:,1:end))
    ça le fait chez toi mais c'est pas les couleurs que tu souhaites c'est ça ?

    je ne suis pas sur qu'il y ait de solution à ton problème.

    en tout cas j'ai déjà cherché un moment et j'ai du me résoudre à la boucle for.

  3. #3

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Citation Envoyé par svagrim Voir le message
    normalement matlab incrémente automatiquement les couleurs quand tu fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(Y1(:,1:end),Y2(:,1:end),'.','color',color(:,1:end))
    ça le fait chez toi mais c'est pas les couleurs que tu souhaites c'est ça ?

    je ne suis pas sur qu'il y ait de solution à ton problème.

    en tout cas j'ai déjà cherché un moment et j'ai du me résoudre à la boucle for.
    Non, justement, c'est le problème que je souhaiterai contourner : cette syntaxe ne marche pas.

    Bonjour,

    Voir la Comment associer une couleur unique à chaque courbe tracée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    figure
     
    nCourbes = 10;
    couleurs = hsv(nCourbes);
     
    for n=1:nCourbes
        h(n) = line(rand(3,1),rand(3,1),'color',couleurs(n,:));
    end
    Est donné par la FAQ. Or, dans mon cas, je ne peux pas me permettre une boucle sur le graphique avec un hold on/all : je dois placer plus de 10k points qui doivent tous (malheureusement pour la lisibilité des résultats) avoir une couleur différente. De fait, faire une boucle avec une fonction 'hold' me renvoie une erreur de type 'time out' de la part de la fonction plot (me demandez pas pourquoi, je ne sais malheureusement pas).

    D'où l'idée de tout faire de façon 'vectorielle' et non scalaire/boucle dans le script, sinon ce post de question n'existerait pas.

    A plus tard,

    Marlan

  5. #5
    Invité
    Invité(e)
    Par défaut
    Et en regardant plus bas dans le même sujet de la FAQ, la propriété ColorOrder est évoquée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    N = 10;
    M = 15;
    mesCouleurs = rand(N,3);
    set(gca,'colororder',mesCouleurs)
    plot(rand(M,N),rand(M,N))

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Oki merci bien. Je n'avais effectivement pas vu ça.

    Fait intéressant du pourquoi cela ne marche pas : il semblerait que si le tableau ne comporte qu'une seule ligne/colonne, alors la couleur est par défaut mise à bleue, et je n'arrive pas à la rendre variable. Faites le test en prenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    N = 10;
    M = 1;
    mesCouleurs = rand(N,3);
    set(gca,'colororder',mesCouleurs)
    plot(rand(N,M),rand(N,M))
    Donc, la question est transformée maintenant : avez vous une idée de comment faire pour générer dix couleurs différentes dans un cas comme celui cité ci-dessus?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Marlan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(rand(N,M),rand(N,M))
    M et N à échanger (j'ai modifié mon message, mais pas assez vite apparemment ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(rand(M,N),rand(M,N))
    C'est une couleur par colonne.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Hélas, il semblerait que non : il n'y a aucune différence si l'on fait :

    plot(rand(M,N),rand(M,N))
    ou

    plot(rand(N,M),rand(N,M))
    Dans le cas où l'un des éléments est égal à 1 (en taille). Peut être ai-je loupé un truc sinon?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Dans un premier temps, dans ton premier message, tu parlais de Y1(:,1:end) donc à priori de taille MxN (M,N>1).
    Et pour cela la syntaxe que je t'ai donnée marche très bien.

    Maintenant en effet, lorsque les deux sont de simples vecteurs, tu obtiens un seul objet Line (de même couleur donc) passant par tous tes points.
    Voici donc une façon d'éviter cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot([rand(1,N) ;nan(1,N)],[rand(1,N) ;nan(1,N)])
    Maintenant sache qu'au niveau performance, ce que tu fais ici n'est vraiment pas le top: tu crées N objets de type Line pour chaque ligne plot(...)À toi de voir donc...

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    En fait, le cas sur lequel je suis tombé (cas particulier) en sortie de mon code correspondait, malheuresement au cas évoqué juste là. Donc j'avais un élément vecteur.

    Du coup, même si ça rajoute effectivement pas mal de temsp de calcul, en attendant, ta solution me convient.

    Merci beaucoup,

    A peluche,

    Marlan

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Couleur sur graphique à bulles
    Par olibn14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/07/2014, 17h40
  2. Réponses: 4
    Dernier message: 15/02/2008, 11h36
  3. auto-incrément Mysql sur Access
    Par maxireus dans le forum Access
    Réponses: 4
    Dernier message: 07/03/2006, 01h35
  4. auto-incrément Mysql sur Access
    Par maxireus dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 06/03/2006, 22h20
  5. [CR 8.5] Attribution couleur sur un graphique
    Par Silvinho42 dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 30/06/2005, 16h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo