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

Signal Discussion :

Récupérer des valeurs en cliquant sur un graphique [Débutant]


Sujet :

Signal

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Récupérer des valeurs en cliquant sur un graphique
    Bonjour,

    Je suis débutante en Matlab, et j'ai besoin de faire du traitement du signal via Matlab pour mon stage.
    J'aimerai, à partir d'un graphique tracé (plot), récupérer deux valeurs de ce graphe en cliquant simplement sur les zones qui m'intéressent (2 points). Puis, je souhaiterai faire la moyenne des valeurs comprises sur le graphique entre ces 2 points. Je ne m'intéresse pas à la moyenne du temps (en x), mais à mes données en y.
    J'ai essayé en reprenant des exemples trouvés, mais ça ne marche pas..

    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
    data_offset = detrend(MVC);   %Supprimer offset
    figure(10)
    plot(t,data_offset)
    fig = figure(1);
    dcm_obj = datacursormode(fig);
    set(dcm_obj,'DisplayStyle','datatip','SnapToDataVertex','off','Enable','on')
    disp('Click line to display a data tip, then press Return.')
    pause 
    c_info1 = getCursorInfo(dcm_obj);
    set(c_info1.Target,'LineWidth',2) 
     
    fig = figure(10);
    dcm_obj = datacursormode(fig);
    set(dcm_obj,'DisplayStyle','datatip','SnapToDataVertex','off','Enable','on')
    disp('Click line to display a data tip, then press Return.')
    pause 
    c_info2 = getCursorInfo(dcm_obj);
    set(c_info2.Target,'LineWidth',2) 
     
    data_mean=mean(c_info1.Position(:,2):c_info2.Position(:,2));  %2ème colonne pour avoir les y

    Merci pour votre aide !

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour,

    Je pense que le plus simple serait d'utiliser la fonction ginput.

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut Récupérer des valeurs avec la souris
    Bonjour,

    Un exemple comme indiqué par Gooby :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    clear
    x=0:0.1:10;
    y=sin(x);
    plot(x,y)
    grid
    [X,Y] = ginput(1)
    gtext(['  ' num2str(X) '   '  num2str(Y)])
    hold on
    plot(X,Y,'.r','MarkerSize',20)

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    J'ai essayé le code que vous m'avez transmis. La fonction ginput récupère les coordonnées de mes deux points et fais la moyenne à partir de la courbe que j'avais au départ, c'est ça ?
    Est-ce qu'il est possible de tracer par dessus la courbe initiale la courbe entre ces deux points ?

    Merci beaucoup pour votre aide !

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    La fonction ginput ne fait que te donner les coordonnées de ta souris sur l'axe au moment où tu cliques. A toi d'effectuer la suite !

    Est-ce que les données de ton graph sont stockées dans un tableau? ça faciliterait un peu la suite du travail

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Ah ! D'accord je n'avais pas compris, car la fonction me demande de sélectionner deux points alors je pensais que ça faisait la moyenne entre les 2 points. Du coup, pourquoi il me fait en sélectionner deux si finalement il ne retient que la deuxième valeur ?

    (Tous mes graphes sont tracés à partir de tableaux)

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    [x,y] = ginput(2); te donnera en x(1) y(1) les coordonnées de ton premier point et dans x(2) y(2) les coordonnées du second point. Ensuite, pour faire la suite de ce que tu demandes, il y a plusieurs approches.

    -Soit tu cherches les points y = f(x) correspondant aux x que tu auras sélectionnes (et là attention ! il faudra probablement trouver dans ton tableau les valeurs de x qui se rapproche le plus de la valeur de x sélectionné !) Exemple: si dans ton tableau tu as x = [ 0 1 2 3 4 5] et que ginput t'as renvoyé x = 2.13, il faudra alors que tu trouves la valeur la plus proche existante dans ton tableau, ici 2.

    -Ou bien tu prends directement la valeur de y renvoyé par ginput, mais dans ce cas c'est à supposer que tu as bien cliqué précisément sur un point de ta courbe. Je mets précisément en italique car c'est relatif à ton besoin.

    Pour être rigoureux j'utiliserais la première méthode. Elle a en plus pour avantage de ne pas nécessiter de cliquer sur un point de la courbe, juste à un niveau d'abscisse voulue.

  8. #8
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    J'essaye de faire la première solution comme tu l'as proposé, en essayant de faire un intervalle, mais ça ne fonctionne pas..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    plot(tMVC,MVC)
    [X,Y] = ginput(2) ;
     
    idx1 = find(Y(1)<MVC<Y(2)) ; 
    MVC_index = MVC(idx1);
     
    idx2 = find(X(1)<tMVC<X(2)) ; 
    t_index = X(idx2);

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Moi je ferai plutôt comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [X,Y] = ginput(2) ;
    [~,idxPoint1] = min(abs(MVC - Y(1)));
    [~,idxPoint2] = min(abs(MVC - Y(2)));
     
    if ( idxPoint1 < idxPoint2 )
        myMean = mean(MVC(idxPoint1:idxPoint2));
    else
        myMean = mean(MVC(idxPoint2:idxPoint1));
    end

  10. #10
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    En faisant comme ça, ça ne me donne qu'un seul point (la moyenne), alors que je veux un tableau de valeurs de ma courbe initiale entre ces deux points

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Dans ce cas, il te suffit de faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [X,Y] = ginput(2) ;
    [~,idxPoint1] = min(abs(MVC - Y(1)));
    [~,idxPoint2] = min(abs(MVC - Y(2)));
     
    if ( idxPoint1 < idxPoint2 )
        myMean = MVC(idxPoint1:idxPoint2);
    else
        myMean = MVC(idxPoint2:idxPoint1);
    end

  12. #12
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    C'est exactement ce que je cherchais
    Il y a juste un petit problème, lorsque je sélectionne mes deux points, les points réellement enregistrés ne sont pas les mêmes. Par exemple, imaginons que j'ai deux pics, je choisis de prendre seulement le premier avec mes curseurs, et bien ce seront les valeurs du deuxième qui seront enregistrées...

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Est-ce que tu peux illustrer ton propos via un schéma ou un exemple un peu plus concret? je ne vois pas de raison à ce comportement.

  14. #14
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Nom : Matlab 2.PNG
Affichages : 2025
Taille : 65,5 KoNom : Matlab.PNG
Affichages : 2063
Taille : 64,5 Ko

    En rouge, les deux points que j'ai sélectionné avec mon curseur, en orange, la courbe qu'il a sélectionné. C'est complètement aléatoire..

  15. #15
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Oui en effet. Ce n'est pas aléatoire. C'est parce qu'à l'endroit où tu cliques n'est pas forcément l'endroit le plus proche sur l'ensemble de ta courbe en fonction de Y. En fait cela vient du fait que pour un X donné, il existe un unique Y tel que Y=f(x), mais l'inverse n'est pas vrai.
    Du coup, mieux vaut travailler sur les X, et bien faire attention à quel endroit tu cliques en fonction de X ce coup ci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [X,Y] = ginput(2) ;
     
    [~,idxPoint1] = min(abs(tMVC - X(1)));
    [~,idxPoint2] = min(abs(tMVC - X(2)));
     
    if ( idxPoint1 < idxPoint2 )
        myMean = mean(MVC(idxPoint1:idxPoint2));
    else
        myMean = mean(MVC(idxPoint2:idxPoint1));
    end

  16. #16
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Ça marche parfaitement ! Merci beaucoup !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/12/2008, 14h39
  2. récupérer des valeurs sur une page web
    Par houwa dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/07/2008, 14h27
  3. Réponses: 3
    Dernier message: 23/10/2007, 13h35
  4. Réponses: 6
    Dernier message: 20/04/2007, 11h38
  5. [Spring MVC] Récupérer des valeurs de formulaires sur n pages
    Par ran_hery dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 07/04/2006, 07h23

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