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 :

Plusieurs plot sur un même axes dans un GUI


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut Plusieurs plot sur un même axes dans un GUI
    Salut à tous,

    J'essaie tant bien que mal d'afficher plusieurs plots sur un même axis, avec ,... mais rien n'y fait. J'aurais également aimé savoir si varargin peut être une structure car cela raccourcirait nettement mes arguments d'entrée
    Enfin, l'appel de mes plots, je ne les fais pas directement dans les fichier m du GUI mais dans un fichier qu'il appelle (NB: le code que j'ai mis la est celui que je teste pour le moment mais au final, j'aurai 5-6 plot par axes...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    x = 1:0.01:1000;
    y = x;
    hs = findobj('Type','axes','Tag','hs_graph');
    axes(hs);
    hold on
    plot(x, y);
    plot(x, y2);
    hold off
    y2 = x.^2;
    ts = findobj('Type','axes','Tag','ts_graph');
    axes(ts);
    plot(x, y2);
    Merci d'avance pour votre aide

  2. #2
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    voici pour ma petite contribution, pour afficher plusieurs plot dans un même axes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    x = 1:0.01:1000;
    y=x;
    y2 = x.^2;
    plot(x,y,'r',x,y2,'b');
    par contre je ne comprends pas à quoi sert la variable "hs" et "ts", ils ne changent rien au plot.

    ici t´as défini la variable y2 après ton plot, ça devrait se faire avant.

    pour les autres questions, aucune idée...

  3. #3
    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,

    Je te conseille d'utiliser des "handle". Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    F1 = figure;
    A1 = axes('parent', F1, 'outerposition', [0 0 1 1]);
    plot(A1, [1 2 1 2 3 2 1 2 1], [1 2 3 4 5 6 7 8 9]);
    hold(A1, 'on');
    plot(A1, [1 2 3 4 5 6 7 8 9], [1 2 3 4 5 6 7 8 9], 'r');
    Pour accéder aux éléments de varargin, tu peux procéder ainsi :
    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
    function ma_fonction(varargin)
    % usage: ma_fonction(x,'propriete',valeur,'...)
    x = varargin{1};
    property_argin = varargin(2:end);
    while length(property_argin) >= 1,
     property = property_argin{1};
     value    = property_argin{2};
     property_argin = property_argin(3:end);
     switch lower(property)
       case 'ma_proprite_1'
         var_1 = value;
       case 'ma_proprite_2'
         var_2= value;
       case ...
         ...
       otherwise
         msg = sprintf('Propriété inconnue:"%s"',property);
         error(msg);
     end
    end
    (ce dernier code-exemple est piqué je ne sais plus trop d'où, mais il te donne les informations dont tu as besoin)

    Cordialement,
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Merci beaucoup pour vos réponses. Le truc est que je plot mes graphes en dehors de la fonction d'interface graphique mais j'appelle cette dernière juste avant mes plots, d'où le findobj et mes variables hs et ts.

    Ce qui ne fonctionne pas c'est de faire plusieurs plot, que ce soit dans la même commande ou pas, il me retourne cette erreur:
    Error using axes
    Invalid object handle

    Error in mafonction (line 145)
    axes(hs);
    Je pense que comme je ne suis pas dans ma fonction de GUI, je ne peux pas utiliser les handles, en tous cas, cela ne fonctionne pas non plus :/ mais comme je le répète, si je ne fais qu'un plot pour chaque axes, ça fonctionne parfaitement...

    Merci beaucoup pour le code de varargin il va m'être très utile

    Merci d'avance pour votre aide!

  5. #5
    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,

    As-tu compris le premier code pour les plot ? Il te montre comment créer tes handles à la main, sans avoir besoin d'utiliser de findobj ou je ne sais quoi... Tu crées tes propres handles, avec un nom qui te convient, donc problème de recherche de handle tout bonnement supprimé : plus de problème.

    Et la bonne affaire dans tout ça, c'est que tu peux passer tes handles via l'entrée d'une fonction : donc si tu définis une fonction qui doit s'occuper de dessiner un graphique, tu n'as qu'à lui spécifier en entrée de la fonction le handle du graphique, tout simplement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function output = dessiner_dans_ce_graphique(A_numero_i)
    plot(A_numero_i, [1 2 3 2 1]);
    %...
    end
    Bref, en procédant ainsi, tu peux maîtriser ce que tu fais.

    Par contre, je ne connais pas la méthode classique avec findobj, donc je ne pourrai pas t'aider plus si tu préfères cette méthode : il faudra qu'une autre personne t'apporte sa réponse.

    Mais bon, au vu de l'erreur, tu ne lui fournis pas le bon handle... [EDIT] normal : ton "hs" est déjà le handle d'un axes... et par la suite tu veux construire un nouvel "axes" avec comme parent un autre "axes"... ce qui est impossible : le seul type de parent possible pour créer un nouvel axes est "figure" (ou à la limite "uipanel"). Ici, tu peux directement utiliser ton "hs" car c'est déjà un axes. Sans findobj et en nommant correctement tes variables, tu n'aurais pas fait cette bourde... avis personnel.

    Cordialement,
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Tout d'abord, merci pour ta réponse. Je suis débutant en matière de GUI, donc j'essaie de bien comprendre et il est normal que je fasse des "bourdes" .

    Je comprends bien que je peux créer mes propres handles mais le truc est que quand j'ai créé mon .fig de GUI, j'ai placé deux axes dont les noms sont hs et ts. Ensuite, ce que j'aimerais c'est faire plusieurs plot dans hs et plusieurs plot dans ts mais pas moyen. Pour moi, j'ai besoin d'un findobj pour qu'il aille bien chercher le bon axes que j'ai créé en fonction du tag (déjà défini)!

    En ce qui concerne l'argument input varargin, en fait j'ai la fonction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function varargout = mafonction(varargin)
    et lorsque je vais appeler cette fonction, j'aimerais lui passer des structures contenant des variables plutôt que chaque variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafonction(struct1, struct2,...)
    Mais ce que je n'arrive pas a faire après, c'est récupérer mes structures et les utiliser, c'est à dire, faire par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct1.elem1 = varargin(1).elem1;
    Merci de m'éclairer plus sur ces handles, tag,... et de m'aider à résoudre ce problème de plot

  7. #7
    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,

    De rien, ne t'inquiète pas ^^

    Tu as compris mon [edit] ? Cela devrait répondre à ton problème, mais je ne suis pas sûr que tu aies saisi : c'est résolu ou pas ce problème de plot, maintenant ? Sinon, je peux te re-expliquer.

    Ensuite, pour varargin, tu dois d'abord récupérer la structure : Et après seulement accéder aux éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcut1.elem1;
    %etc...
    Tu ne peux pas faire directement car les deux caractères : ")." est une expression non reconnue sous matlab... c'est louche, mais c'est comme ça. Donc procède par petites étapes.

    Cordialement,

    ps: je n'ai rien contre le gui, c'est très bien. Le souci est que l'on ne maîtrise pas trop ce que l'on fait, et je trouve qu'on perd trop de temps à chercher à récupérer les handles... alors que quand on code à la main, il n'y a plus besoin de chercher : on les a. Mais je conçois que le guide soit très pratique ! C'est juste que comme je ne l'utilise pas, des fois, je ne comprends pas très bien les erreurs et j'ai du mal à aider correctement.
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Merci de prendre le temps de m'expliquer

    Je n'ai jamais utilisé le GUI de Matlab jusqu'à ces jours-ci et c'est parce que j'y suis un peu "forcé"... mais enfin bref!

    Pour ce qui est de ton [edit], je veux bien que tu me clarifies un peu le truc, si ça ne t'embête pas! Je pense avoir compris mais en terme de code, je ne vois pas trop ce que je devrais faire alors!

    Pour l'histoire des structures, si je fais
    sur la console, je vois
    [1x1 struct]
    Si maintenant je fais
    il m'affiche cette erreur...
    Attempt to reference field of non-structure array.
    Je n'arrive donc pas à aller rechercher les éléments de ma structure... Si je pouvais passer des structures dans varargin et les récupérer, alors mon problème de graphe serait lui aussi résolu je pense mais d'une autre manière (néanmoins ton explication de l'edit m'intéresse

    Merci pour ton aide précieuse!

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Si tu souhaites ne passer qu'une structure, autant la passer directement non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function [<arguments>] = maFonction(struct1)
    varargin sert à pouvoir passer un nombre variable d'arguments, cela ne semble pas être le cas ici ?

    Ton autre problème concernant les plots est que findobj te retourne je pense un tableau vide. Travailles-tu avec GUIDE ? Si c'est le cas, ton objet Figure a par défaut la propriété 'HandleVisibility' à 'callback', ce qui empêche la fonction findobj de la "voir".
    Je te conseille de faire passer le handle de ta figure en paramètre pour pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s = findobj(handleFigure, 'Type','axes','Tag','hs_graph');
    Pour répondre à ta dernière question, il faut utiliser les accolades :
    varargin est un tableau de cellules

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Super, merci pour ta réponse, maintenant que je sais gérer des structures, c'est parfait! Je vais faire mes graphes dans la fonction générée par GUIDE en lui passant en paramètres.

    Par contre, je n'ai pas compris ce qu'est mon 'handleFigure'... Apparemment, ce n'est pas le tag que je lui ai associé dans l'environnement GUIDE, alors à quoi correspond-t-il?

    Merci pour ton aide

  11. #11
    Invité
    Invité(e)
    Par défaut
    Mon handleFigure = handles.<Tag donné à ta figure> si tu préfères.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Impec, merci bien!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/03/2012, 17h02
  2. Plot succesifs sur le même Axes impossible
    Par wawa84 dans le forum Interfaces Graphiques
    Réponses: 10
    Dernier message: 26/03/2012, 11h29
  3. Liste déroulante basée sur un même champ dans plusieurs tables
    Par theclaw dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/04/2011, 18h58
  4. Zoom dans plusieurs images sur une même frame
    Par GDMINFO dans le forum Beamer
    Réponses: 1
    Dernier message: 20/10/2010, 08h41
  5. Définir plusieurs "plot" pour un même "axe"
    Par oOWappOo dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 07/07/2010, 10h47

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