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 :

Spécifier une couleur à une valeur


Sujet :

MATLAB

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut Spécifier une couleur à une valeur
    bonjour,
    j'aurais besoin de spécifier la couleur correspondant à la valeur nulle d'une matrice que j'affiche par la commande "surf".
    Quelqu'un a-t-il déjà été confronté à ce problème ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 895
    Points
    52 895
    Par défaut
    Citation Envoyé par gregory2526
    la couleur correspondant à la valeur nulle d'une matrice
    Bonjour,

    ce n'est pas très clair pour moi !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    bonjour
    désolé pour cette explication peu explicite.

    En fait je créé un maillage par la commande meshgrid.
    J'affiche ensuite les valeurs d'une matrice dans ce maillage par la commande :
    j'utilise la colormap par défaut, j'ai donc un dégradé de bleu (pour la valeur min de la matrice) au rouge (pour la valeur max).
    Ce que je souhaiterai c'est que la valeur 0 soit représentée par une couleur spécifique (par exemple du blanc) afin de bien la différentier (je doit repérer quels sont les éléments de mon maillages contenant la valeur nulle).

    En tout cas merci d'avoir répondu si vite Dumatlab.

  4. #4
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Bonjour,

    Pour cela tu dois modifier juste les valeurs de colormap correspendants au niveau 0 de la matrice:
    le colormap contient 64 couleurs
    le min de la matrice est représenté par la couleur definie par le premier triplet de colormap, et le max par le dernier triplet.
    donc il y a un triplet qui repésente le zero, apres un petit calcule, on trouve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i=(max-64*min)/(max-min)
    donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    a=max(z(:));
    b=min(z(:));
    i=round((a-64*b)/(a-b));
    map=colormap;
    map(i,:)=1; % blanc
    colormap(map);
    surf(x,y,z);

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    merci pour cette réponse.
    Mais il me semble que pour une colormap de 64 couleurs, une couleur représente toutes les valeurs comprises dans l'intervalle correspondant.
    Si je prend par exemple une plage de valeurs de 0 à 10, la première couleurs de la colormap représentera les valeurs de 0 à 10/64=0.15625. Donc si j'ai dans ma matrice une valeur de 1e-3, elle sera blanche.
    Est-ce que c'est bien ça ?
    Si c'est le cas, la méthode que tu m'as donné ne me permettrai pas de représenter uniquement la valeur 0 ?

    A moins que je puisse superposer deux colormap. Dans ce cas, j'utiliserai la colormap de base, puis je superposerai la colormap modifiée par ta méthode en changeant l'échelle pour que seule la valeur 0 soit représentée en blanc.
    Si c'est possible...

    merci encore

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 895
    Points
    52 895
    Par défaut
    Bonjour,

    une solution à tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    z=rand(50);
    z(15:35,15:35)=0;
     
    figure
    colormap(jet)
    s=surf(z)
    axis equal tight off
    colorbar
     
    figure
    colormap([ 1 1 1 ; jet]);
    z(~z)=-(a-b)/64;
     
    s=surf(z)
    axis equal tight off
     
    c=colorbar;
    set(c,'ylim',[0 1])

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    merci pour cette solution
    ça a l'air de fonctionner pas mal
    Il y a quelques points de la matrice qui sont affichés blancs alors qu'ils ne sont pas nuls mais j'ai testé vite fais...
    Je vais m'y plonger plus serieusement maintenant pour voir si je m'en sort.
    Merci encore.

  8. #8
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Bonsoir,

    Si je prend par exemple une plage de valeurs de 0 à 10, la première couleurs de la colormap représentera les valeurs de 0 à 10/64=0.15625. Donc si j'ai dans ma matrice une valeur de 1e-3, elle sera blanche.
    Est-ce que c'est bien ça ?
    Si c'est le cas, la méthode que tu m'as donné ne me permettrai pas de représenter uniquement la valeur 0 ?
    absolument.

    donc, il faut prendre une colormap avec n couleurs diffirentes tel que (max-min)/n soit inferieur à la valeur la plus proche de zero, en connaissant cette valeur, on peut determiner n:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n> (max-min)/x   x est la plus proche valeur de zero
    donc, je propose ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    z=(19:-1:-19)'*(-19:19);
    a=max(z(:));
    b=min(z(:));
    n=ceil((a-b)/min(abs(z(~~z))));
    i=round((a-n*b)/(a-b));
    map=jet(n);
    map(i,:)=1; % blanc
    colormap(map);
    surf(z);
    remarque: x ne doit pas être trés petit, pour ne pas avoir un n trés grand

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 895
    Points
    52 895
    Par défaut
    Une solution "économique" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    z=rand(50);
    z(15:35,15:35)=0;
     
    figure('color','w')
     
    surf(z,'facealpha','interp','alphadata',~~z)
    axis equal tight off
    colorbar;

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    merci pour ta réponse rostomus
    En réfléchissant sur la solution de Dumatlab, j'ai pensé effectivement à avoir un intervalle plus petit. En utilisant la même méthode en remplacant par
    ça avait l'air de marcher puisque dans ce cas les éléments non nuls n'étaient plus dans le premier intervalle de la colormap
    J'ai ensuite vu ta réponse et effectivement c'est plus simple de donner une colormap avec un nombre plus grand d'éléments.

    Finalement la dernière méthode m'avait l'air plus simple a utiliser. Par contre elle ne fonctionnait pas mais ça m'a bien mis sur la voie. En cherchant dans la doc, j'ai fait (après avoir rempli la matrice z) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Z=zeros(50,50)
    Z(25,:)=1
    Z(:,25)=1
    surf(z,'facealpha','flat','alphadata',Z)
    Le seul défaut est qu'il faut définir une matrice "calque" de même taille contenant 0 dans les zones à afficher et 1 dans les zones transparentes, ce qui peut être un peu lourd dans le cas de très grosses matrices.
    (j'ai ici seulement effacé deux lignes, il faudra que je fasse proprement une matrice Z)


    Lorsque j'utilisait directement le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    surf(z,'facealpha','interp','alphadata',~~z)
    j'avais le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> surf(z,'facealpha','interp','alphadata',~~z)
    ??? Value must be numeric.
     
    Error in ==> surf at 81
        hh = double(graph3d.surfaceplot(args{:},'parent',cax));
    je pense que c'est le ~~z que matlab n'a pas aprécié

    Bref, j'ai obtenu ce que je voulais
    merci a tous les deux

    PS : est-ce que c'est moi qui cloture la discussion?

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    rebonjour
    Je me permet de réouvrir la discussion, je ne sais pas si j'ai bien fait...

    Il s'agit d'un détail qui a son importance...

    La transparence est décalée par rapport à la matrice d'origine.

    Je créé une matrice calque à partir de la matrice d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    % creation de la matrice calque
     calque=matrice;
     calque(~~calque)=1;
     
    figure('color','w')
    map=jet(64);
    colormap(map);
     
     
    [YY3,ZZ3]=meshgrid(grilleY,grilleZ);
    surf(YY3,-ZZ3,matrice','facealpha','flat','alphadata',calque')
    view(2)
    axis equal
    title('YZ')
    xlabel('y (m)')
    ylabel('z (m)')
    colorbar
    Dans la première partie j'ai copié la matrice d'origine dans calque.
    J'ai ensuite mis 1 à tous les termes non nuls pour qu'ils soient opaques.

    Lorsqu'on fait l'affichage, la transparence est décalée de 1 rang à droite et de 1 rang en bas.
    J'ai résolut le problème en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    % creation de la matrice calque
     calque=matrice(2:size(matrice,1),2:size(matrice,2));
     calque=[calque ones(size(calque,1),1)];
     calque=[calque ; ones(1,size(calque,2))];
    calque(~~calque)=1;
    Mais ce n'est pas très propre. Je n'ai pas trouvé d'explications à ce décalage... Si quelqu'un a une idée...

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 895
    Points
    52 895
    Par défaut
    C'est assez simple... mais c'est écrit en anglais dans la documentation de l'objet SURFACE à la propriété FaceAlpha ... allons un petit effort :

    flat — The values of the alpha data (AlphaData) determine the transparency for each face. The alpha data at the first vertex determine the transparency of the entire face.
    C'est exactement ce qui arrive avec la solution "économique"

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    j'ai honte ...

    La prochaine fois je ferai plus attention. En plus je suis passé une dizaine de fois sur cette page de doc.

    Merci encore

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

Discussions similaires

  1. Spécifier une couleur à une courbe d'un graphe
    Par KNouch dans le forum LabVIEW
    Réponses: 2
    Dernier message: 25/01/2012, 15h29
  2. imposer une couleur à mes valeurs
    Par marie33000 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/05/2009, 15h41
  3. [VBA] Donner une couleur à une case
    Par ickyknox dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/03/2008, 13h44
  4. Attribuer une couleur à une cellule
    Par digitale83 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/09/2007, 16h48
  5. attribuer une couleur à une ligne d'une gridview
    Par babafredo dans le forum ASP.NET
    Réponses: 6
    Dernier message: 16/07/2007, 11h35

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