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 :

[scatter] une couleur par vecteur changeant [Débutant]


Sujet :

MATLAB

  1. #1
    Membre du Club
    Homme Profil pro
    Biologiste
    Inscrit en
    Mai 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Mai 2017
    Messages : 66
    Points : 44
    Points
    44
    Par défaut [scatter] une couleur par vecteur changeant
    Bonjour,

    Je cherche à faire afficher les coordonnées d'espèces sur une carte avec une couleur différente par espèce :

    Je vais chercher mes données dans une excel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    [filename, pathname] = uigetfile('*.xls','Ouvrir le fichier Excel');
    route = [pathname filename];
    [status,sheets]=xlsfinfo(route);
    if length(sheets)==1
        [num,txt,raw]=xlsread(route);
    else
        sht=listdlg('Liststring',sheets,'Promptstring',['Ouvrir la feuille de ' filename],'ListSize',[180 100],'Selectionmode','single');
        [num,txt,raw]=xlsread(route,sheets{sht});
    end
     
    % Nombre de rencontre par espèce
    Espece = raw((2:end),7); % toutes les rencontres espèces
    Esp_Uniq = unique(Espece); % nom des espèces observées
    Les noms d'espèce ressemble à : Sa Pm Lh
    Pour le moment je n'ai que 7 espèce rencontrées mais je peux avoir au final jusqu'à 15 espèces différentes

    Ensuite je récupère les coordonnées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Xcdn = num(:,4); % Coordonnées X
    Ycdn = num(:,3); % Coordonnées Y
     
    % Sa
    Sa = strcmp(Espece,'Sa'); % indice Sa
    X_coord_Sa = Xcdn(Sa); % coordonnées des obs Sa
    Y_coord_Sa = Ycdn(Sa);
     
    % Pm
    Pm = strcmp(Espece,'Pm'); % indice Sa
    X_coord_Pm = Xcdn(Pm); % coordonnées des obs Sa
    Y_coord_Pm = Ycdn(Pm);
    Je cherche un code pour automatiser car le nombre d'espèce peut changer et donc leur position dans la liste unique aussi...
    Je sèche un peu.
    J'ai pensé assigner une valeur, et utiliser un switch, mais je ne vois pas comment assigner une valeur a un texte tout en connaissant le texte après coup.
    En gros il me faudrait une sorte de légende sur la carte pour retrouver quelle couleur pour quelle espèce !

    Pour le plot d'une espèce (Sa) je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    figure(2)
    k=imread('CartePm1.jpg');
    b=flipud(k);
    image([-62.216 -61.545],[15.785 16.59],b);
    set(gca,'Ydir','Normal');
    hold on
    scatter(X_coord_Sa,Y_coord_Sa,15,'r','filled')
    daspect([0.901 1 0.901])
    title(['Répartition des individus'],...
        'FontSize',12,'FontWeight','bold');
    Pour une c'est facile, mais j'aimerais l'automatiser car ma BDD change à chaque jour...

    Please Help ! Mon cerveau boite en ce moment !

  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 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Comme ceci ?

    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
    Espece = {'Sa' 'Pm' 'Sa' 'Sa' 'Lh' 'Lh' 'Sa'};
     
    n = numel(Espece);
    Xcdn = rand(n,1);
    Ycdn = rand(n,1);
     
    [Esp_Uniq, ~, b] = unique(Espece);
     
    figure
    col = parula(max(b));
    hold on
    for n = 1:max(b)
        idx = b==n;
        h(n) = plot(Xcdn(idx), Ycdn(idx), 'o', 'color', col(n,:), 'markerfacecolor', col(n,:));
    end
    legend(h, Esp_Uniq)
    Images attachées Images attachées  
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre du Club
    Homme Profil pro
    Biologiste
    Inscrit en
    Mai 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Mai 2017
    Messages : 66
    Points : 44
    Points
    44
    Par défaut
    Génial !

    Comme toujours sur ce forum, vous êtes au top !
    Merci Jerome c'est exactement ce que je cherchais, ça marche nikel et j'en ai encore appris un peu plus !
    J'ai seulement changé parula par hsv car je voulais des couleurs plus tranchées pour mieux distinguer les espèces !

    Nom : resultat01.jpg
Affichages : 223
Taille : 39,6 Ko

  4. #4
    Membre du Club
    Homme Profil pro
    Biologiste
    Inscrit en
    Mai 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Mai 2017
    Messages : 66
    Points : 44
    Points
    44
    Par défaut
    Pour un autre graphe dans le même genre j'ai petit problème :
    Par rapport à ton exemple je me retrouve avec un 'b' composé de 1 et de 3 (pas de 2)
    Du coup quand je fais tourner la boucle for avec :

    n = 1:max(b)
    idx = b==n;

    Quand n=2 ; idx bug

    C'est là que je regrette de ne pas avec fait de matlab pendant mes études (de bio) !

  5. #5
    Membre du Club
    Homme Profil pro
    Biologiste
    Inscrit en
    Mai 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Mai 2017
    Messages : 66
    Points : 44
    Points
    44
    Par défaut
    Bon j'ai essayé ça ! j'ai bien les points qui affichent 2 couleurs pour les 2 activités, c'est juste la légende qui va pas !
    La légende devrait afficher les activités 1 et 3 et me met 1 et 2 à cause de n...

    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
     
    [Activ_Uniq, ~, c] = unique(Activite); 
    C = c(E_Logic); % E_Logic correspond aux indices de l'espèce sélectionnée 
    Cuniq = unique(C);
    NCuniq = numel(Cuniq);
     
    figure(3)
    colA = hsv(max(C));
    hold on
     
    for n = 1:NCuniq
        V=Cuniq(n,:);
        idxA = C==V;
        H(n) = plot(X_coord(idxA), Y_coord(idxA), 'o', 'color', colA(n,:), 'markerfacecolor', colA(n,:));
    end
     
    legend(H, Activ_Uniq,'Location','southwestoutside')
    L'idée de base est d'afficher uniquement les points d'une espèce que je sélectionne, mais avec une couleur pour chaque activité qu'avait l'espèce au moment de la rencontre (alimentation, repos...)

  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 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par hydric Voir le message
    Par rapport à ton exemple je me retrouve avec un 'b' composé de 1 et de 3 (pas de 2)
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    figure
     
    col = hsv(max(b));
    hold on
    for n = 1:max(b)
        idx = b==n;
        if any(idx)
            h(n) = plot(x(idx), y(idx), 'o', 'color', col(n,:), 'markerfacecolor', col(n,:));
        else
            h(n) = plot(NaN, NaN, 'o', 'color', col(n,:), 'markerfacecolor', col(n,:));
        end
    end
    legend(h, Esp_Uniq)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre du Club
    Homme Profil pro
    Biologiste
    Inscrit en
    Mai 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Mai 2017
    Messages : 66
    Points : 44
    Points
    44
    Par défaut
    Merci, pour les données c'est nickel, mais ça bug encore pour la légende !
    La deuxième ligne (point vert) ne devrait pas apparaître !

    Nom : resultat02.jpg
Affichages : 229
Taille : 39,0 Ko

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par hydric Voir le message
    Merci, pour les données c'est nickel, mais ça bug encore pour la légende !
    La deuxième ligne (point vert) ne devrait pas apparaître !
    Je pensais que tu voulais avoir toutes les entrées même sans données affichées

    Comme ceci alors ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    figure
     
    col = hsv(max(b));
    hold on
    k = 0;
    for n = 1:max(b)
        idx = b==n;
        if any(idx)
            k = k+1;
            h(k) = plot(x(idx), y(idx), 'o', 'color', col(n,:), 'markerfacecolor', col(n,:));
            sub_Esp_Uniq(k) = Esp_Uniq(n);
        end
    end
    legend(h, sub_Esp_Uniq)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Membre du Club
    Homme Profil pro
    Biologiste
    Inscrit en
    Mai 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Mai 2017
    Messages : 66
    Points : 44
    Points
    44
    Par défaut
    Et voilà c'est parfait ! merci ça marche au top !

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

Discussions similaires

  1. Comment définir une couleur par ligne dans un objet uicontrol de type Text
    Par VinceDA dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 28/05/2007, 12h13
  2. Remplacer une couleur par une autre couleur
    Par brice01 dans le forum SDL
    Réponses: 6
    Dernier message: 25/02/2007, 15h38
  3. Une couleur par groupe dans un état
    Par cguedj dans le forum Access
    Réponses: 3
    Dernier message: 03/08/2006, 10h54
  4. Composant de type grid ayant une couleur par cellule?
    Par TCC dans le forum Composants VCL
    Réponses: 1
    Dernier message: 29/03/2006, 19h56
  5. [VB.NET] Comment remplacer une couleur par une autre?
    Par jazz matazz dans le forum VB.NET
    Réponses: 5
    Dernier message: 11/02/2006, 14h29

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