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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 expérimenté
    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
    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 éclairé
    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
    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 éclairé
    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
    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 éclairé
    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
    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 émérite
    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
    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,

+ 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, 12h16
  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, 11h39
  3. Réponses: 3
    Dernier message: 14/12/2005, 15h17
  4. [TP] Afficher une valeur avec outtext
    Par Bouilla dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/03/2005, 09h57
  5. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37

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