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 :

récuperer la position d'une valeur avec data cursor


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut récuperer la position d'une valeur avec data cursor
    Bonjour,
    J'affiche une courbe qui ressemble à une patate sur un axes.
    Cette courbe provient d'un tableau, et j'aimerai récupérer le pointeur dans ce tableau correspondant à la valeur sélectionnée avec Data cursor sur mon axes.
    Il peut y avoir plusieurs courbes dans mon axes est-il possible de pouvoir faire cela avec plusieurs courbes ?

    Merci

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    c'est possible, il faut faire un callback sur le datacursormode.

    l'idée est de créer un handle sur le datacursor, et d'utiliser ce handle pour assigner un callback.
    Le code suivant est issu de l'aide Matlab du datacursormode et explique bien le fonctionnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function doc_datacursormode
    % Plots graph and sets up a custom data tip update function
    fig = figure;
    a = -16; t = 0:60;
    plot(t,sin(a*t))
    dcm_obj = datacursormode(fig);
    set(dcm_obj,'UpdateFcn',@myupdatefcn)
    et en ce qui concerne le callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function txt = myupdatefcn(empt,event_obj)
    % Customizes text of data tips
     
    pos = get(event_obj,'Position');
    txt = {['Time: ',num2str(pos(1))],...
    	      ['Amplitude: ',num2str(pos(2))]};
    Pour ce qui te concerne c'est un peu plus funky : je connais pas ton problème de fond en comble mais je pense qu'il faudra que tu utilises des getappdata/setappdata pour "sauver" des données dans ta figure et pouvoir travailler dessus dans ce callback.

    Petit exemple adapté de celui écrit au dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function doc_datacursormode2
    % Plots graph and sets up a custom data tip update function
    fig = figure;
    a = -16; t = 0:60;
    plot(t,sin(a*t))
    % ici on génère un jeu de données qu'on voudra voir réapparaître plus tard avec le datacursor, par exemple t^2, (pourquoi pas)?
    carre = t.^2
    %sauvegarde de ces vecteur dans la figure
    setappdata(fig,'donnees_a_rescuperer',carre);
    setappdata(fig,'donnees_debase',t);
     
    dcm_obj = datacursormode(fig);
    set(dcm_obj,'UpdateFcn',@myupdatefcn2)
    et en ce qui concerne le callback
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    function txt = myupdatefcn2(empt,event_obj)
    % Customizes text of data tips
     
    % recuperation du handle de la figure. le data cursor pointe sur un objet line, il faut donc récupérer son grand-père pour tomber sur un objet figure
     
    h_line = get(event_obj,'Target');
    h_axes = get(h_line,'Parent');
    h_fig = get(h_axes,'Parent');
     
    % récupération des données "sauvées dans la figure"
     
    carre = getappdata(h_fig,'donnees_a_recuperer');
    t = getappdata(h_fig,'donnees_debase');
     
    pos = get(event_obj,'Position');
     
    %recuperation de l'indice correspondant au point visé
     
    indice = abs(t-pos(1))<10^-5
    %recuperation de la valeur du carré a la position souhaitée
     
    affiche = carre(indice)
     
    %affichage dans le texte du datacursor
     
    txt = {['Time: ',num2str(pos(1))],...
    	      ['Amplitude: ',num2str(affiche)]};

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Merci
    mais ton exemple commence mal car lors de la phase d'init
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    handles = guidata(gcbf);
    dcm_obj = datacursormode(handles.Viewer);
    set(dcm_obj,'UpdateFcn',@myupdatefcn)
    J'ai cette erreur
    Invalid figure handle
    J'ai bien peur que ton exemple ne marche que pour les figure or dans mon cas ma courbe est dessiné dans un axes.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    J'ai trouvé ce bout de code : ici
    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
     
    % Plot something and activate a data cursor.
    close all
    plot(0,0)
    datacursormode on
     
    % Get the handle to the data cursor.
    menu = findall(get(gcf,'Children'),'Type','uicontextmenu');
    menuCallback = get(menu,'Callback');
    dataCursor = menuCallback{2};
     
    % Get the coordinates if a datatip exists.
    info = getCursorInfo(dataCursor);
    if ~isempty(info)
    disp(info.Position)
    end
    mais lors du findall j'ai une liste de chiffre et je ne sais pas lequel prendre.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    J'ai trouvé comment faire un callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        dcm_obj = datacursormode;
        set(dcm_obj, 'UpdateFcn', @datacursormodeClick);
    et j'utilise cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function output = datacursormodeClick(obj, event_obj)
        pos = get(event_obj, 'Position');
    et j'ai les valeurs de mon point dans pos .
    Par contre ce que je cherche maintenant c'est à partir de ces coordonnées XY retrouvé leur position dans mon tableau de valeur

  6. #6
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Salut,

    Tu peux regarder ce post, ça devrait t'intéresser.

    Si tu as des questions, n'hésites pas (j'utilise une manière de programmer vraiment particulière). Par contre, je trouve que datacursormode rame vraiment beaucoup, j'aimerai avoir ton avis une fois que tu maîtriseras.

    Cordialement,

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    il a quelle tête ton tableau de valeurs?

    parce que si j'ai bien compris :
    -t'as un tableau XY qui contient des coordonnées pour tracer des patates
    -tu traces ces fameuses patates
    -tu cliques sur les patates , tu obtiens les coordonnees du point
    -tu veux récupérer l'indice du tableau correspondant aux coordonées de ce point

    pour récupérer l'indice, tu peux faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    indx = abs(XY-pos(1))<10^-2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    indy = abs(XY-pos(2))<10^-2

    en gros sa te donne un vecteur de booleens de la taille de x, qui contient des 1 à l'endroit de l'indice correspondant au point cliqué et des zéros ailleurs, sur chacun des axes.

    après c'est a adapter, mais si tu pouvais nous montrer à quoi ressemble ce fameux XY ca nous aiderait.

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Tachmou:
    Dans mon axes il peut y avoir 6 ou 7 courbes différentes contenant chacune 40000 points chacune.
    Je ne sais pas si ton code peut être utile pour moi car je ne l'ai pas encore compris
    Je regarde ça.
    Merci

    Dombrai
    Il s'agit d'un tableau de valeur chargé d'un fichier texte
    et j'utilise la colonne 2 et 3 pour tracer ma courbe
    et je veux récupérer l'index de ma position pour pouvoir exploiter la ligne associé à ce point


  9. #9
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Cela ne s'adapte pas tel quel à plusieurs courbes. Par contre, je pense qu'on peut l'adapter (le code que j'avais fait est un peu naze mais peut donner de bonnes idées)... problème intéressant, je vais y réfléchir maintenant que j'ai un bon recul (uniquement pour la masturbation intellectuelle, car malgré tout, j'ai peur que ça rame énormément vu le nombre de points et de courbes... j'insiste sur ce point). Par contre, pas avant lundi prochain, je n'aurai pas le temps d'ici là.

    As-tu testé mon code au fait ? Ou juste lu ?
    Tu utilises quelle version de matlab ?
    L'index que tu veux récupérer, tu veux juste l'afficher ou carrément l'exploiter directement dans ton code pour faire un GUI "intuitif" ?

    ps: si on regarde la doc, on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Line and lineseries objects have an additional field.
    DataIndex
    A scalar index into the data arrays that correspond to the nearest data point. The value is the same for each array.

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    essaye de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    indx = abs(pos(1)-s(:,2))<10^-7
    indy = abs(pos(2)-s(:,3))<10^-7
    indice_ligne = indx&indy

    dans ton callback

    le 10^-7 est globalement pifométrique, faut voir a partir de quand tu as un changement significatif dans les valeurs de tes variables.

    indice_ligne devrait contenir des zeros partout sauf un 1 au niveau de la ligne en question

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    J'ai vu et lu (en partie ton code) voila pourquoi j'ai précisé pour le nombre de points et de courbes .
    J'ai ouvert un autre post pour la recherche dans un tableau ici mais c'est partie un peu en live mais il y a des idées.
    En fait je veux récupérer l'index des coordonnées XY pour pouvoir afficher dans d'autres plot le contenu du tableau à plus ou moins x lignes , c'est clair ?

    dombrai:
    Je n'obtiens que des 0 dans indice_ligne , le réglage reste d'être compliqué.
    sachant que la valeur pos existe dans mon tableau il doit y avoir un moyen précis de sortir l'index

  12. #12
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par sdecorme Voir le message
    J'ai vu et lu (en partie ton code) voila pourquoi j'ai précisé pour le nombre de points et de courbes .
    J'ai ouvert un autre post pour la recherche dans un tableau ici mais c'est partie un peu en live mais il y a des idées.
    En fait je veux récupérer l'index des coordonnées XY pour pouvoir afficher dans d'autres plot le contenu du tableau à plus ou moins x lignes , c'est clair ?
    Parfaitement clair ==> ça va ramer

    Tu vas avoir besoin de la gestion d'indexage (cf faq matlab).

    D'ailleurs, idée : tu enregistres l'index linéaire dans une troisième coordonnée fictive "z"... ainsi, en récupérant position comme le fait dombrai, tu récupères ton "z" qui sera en fait ton index linéaire ==> plus de recherche à faire, et code beaucoup plus rapide que l'utilisation du dataindex et plus propre que ce que fait dombrai... par contre ça peut pourrir ton graphique... à méditer.

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Dombrai:
    le problème de n'avoir que des 0 venait du fait que l'ordre des colonnes n'etait pas bon (copier/coller sans réfléchir ).
    En faisant ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Y = pos(1)-s(:,3);
        X = pos(2)-s(:,2);
     
        indy = abs(Y)<10^-10;
        indx = abs(X)<10^-10;
        indice_ligne = indx&indy;
    j'obtiens ça

    mais je n'arrive pas à affiner

    La formule simple pour obtenir la même chose est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [~ ,r] = ismember(s(:,[3,2]), pos, 'rows')
    s étant le tableau et pos la valeur (x,y) à chercher.
    par contre j'ai le même problème , j'ai 10 bonnes valeurs , je pense que cela vient de la précision du callback , est-il possible d'augmenter la précision du plot ?

  14. #14
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    t'as plusieurs fois les mêmes valeurs de X et Y dans ton tableau. du coup en fait, tu dois tracer chaque point 10 fois...

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    of course je n'y avais pas pensé .
    Merci

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

Discussions similaires

  1. Récuperer 3 dernières positions d'une valeur numerique
    Par sniper75 dans le forum Outils BI
    Réponses: 18
    Dernier message: 25/05/2012, 13h16
  2. Comment récuperer la position d'une cellule avec un Range.
    Par branqueira dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/05/2007, 12h39
  3. Réponses: 3
    Dernier message: 14/12/2005, 16h17
  4. [TP] Afficher une valeur avec outtext
    Par Bouilla dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/03/2005, 10h57
  5. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 17h37

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