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 :

Plot multiples variables


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Homme Profil pro
    M2
    Inscrit en
    Janvier 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : M2

    Informations forums :
    Inscription : Janvier 2018
    Messages : 22
    Points : 15
    Points
    15
    Par défaut Plot multiples variables
    Bonjour,

    Voici ce que j'aimerai réalisé :

    Considérons une matrice A de 10 colonnes correspondant à 10 variables et de 100 lignes correspondant au temps.
    Le plot consiste donc à tracer l'évolution de ces variables selon le temps : plot(t,A) avec t un vecteur contenant les 100 incrémentation de temps
    Cependant, j'aimerai pouvoir déterminer par exemple 1 couleur pour chaque groupe de 2 variables, et au sein de chaque groupe de couleur un type de tracé (pointillé, ligne continu...) pour chaque variable.

    Je peux obtenir le résultat voulu en faisant un plot(...) à rallonge mais je cherche une solution plus optimisée ?
    L'idée étant aussi d'avoir au final une solution plastique, qui peut s'adapter automatiquement à un nombre différent de variables, ou une taille de groupe différente

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

    Une idée pour 4 colonnes (avec une boucle hélas !) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    clear
    Nl=10;
    M=zeros(Nl,4);
    M(:,1)=1:Nl;
    M(:,2)=2*(1:Nl);
    M(:,3)=3*(1:Nl);
    M(:,4)=4*(1:Nl);
    C=['sr';'*r';'.b';'db']
    hold on
    grid
    for i=1:4
        plot(1:Nl,M(:,i),C(i,:))
    end

  3. #3
    Membre à l'essai
    Homme Profil pro
    M2
    Inscrit en
    Janvier 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : M2

    Informations forums :
    Inscription : Janvier 2018
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Intéressant merci, c'est nettement plus plastique que ce que j'avais pour le moment.

    Une boucle sur un plot c'est quelque chose à éviter en principe ? ça peut rapidement devenir lent ?

  4. #4
    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 Rorchar Voir le message
    Une boucle sur un plot c'est quelque chose à éviter en principe ? ça peut rapidement devenir lent ?
    Dans ce cas, tu peux utiliser cette variante :

    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
    clear
    Nl = 10;
    M = zeros(Nl,4);
    M(:,1) = 1:Nl;
    M(:,2) = 2*(1:Nl);
    M(:,3) = 3*(1:Nl);
    M(:,4) = 4*(1:Nl);
     
    lst = {'none' 'none' 'none' 'none'};
    col = {'r' 'r' 'b' 'b'};
    mrk = {'s' '*' '.' 'd'};
     
    figure
     
    h = plot(M);
     
    grid on
     
    for n = 1:numel(h)
        set(h(n), 'linestyle', lst{n}, 'color', col{n}, 'marker', mrk{n})
    end
    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)

  5. #5
    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
    Une autre solution sans boucle mais qui permet de gérer uniquement la couleur des courbes :

    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
    clear
    Nl = 10;
    M = zeros(Nl,4);
    M(:,1) = 1:Nl;
    M(:,2) = 2*(1:Nl);
    M(:,3) = 3*(1:Nl);
    M(:,4) = 4*(1:Nl);
     
    col = [1 0 0 ; 1 0 0 ; 0 0 1 ; 0 0 1];
     
    figure
     
    set(groot, 'DefaultAxesColorOrder', col)
     
    plot(M);
     
    set(groot, 'DefaultAxesColorOrder', 'remove')
     
    grid on
    L'objet groot est disponible depuis la version R2014b de MATLAB. Pour les versions précédentes, il faut essayer avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set(0, 'DefaultAxesColorOrder', col)
     
    set(0, 'DefaultAxesColorOrder', 'remove')
    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)

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

    Une boucle sur un plot c'est quelque chose à éviter en principe ? ça peut rapidement devenir lent ?

    En général utiliser des boucles est une solution de facilité.

    MATALB a été conçu pour les calculs matriciels : MATrix LABoratory.

    Utiliser les vecteurs est donc plus élégant et plus rapide. Mais parfois on ne peut pas faire autrement !

  7. #7
    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
    Ne pas confondre le noyau de calcul de MATLAB et le moteur graphique.

    Pour optimiser le premier, il faut utiliser la pré-allocation de mémoire.
    Pour le deuxième, il faut diminuer le nombre d'appel aux fonctions de traçage.

    Exemple d'un code non optimisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    figure
     
    hold on
     
    for n = 1:10000
     
        M(n,:) = rand(1,500);
     
        plot(1:500, M(n,:))
     
    end
    Si on optimise le calcul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    figure
     
    hold on
     
    M = zeros(10000, 500);
     
    for n = 1:10000
     
        M(n,:) = rand(1,500);
     
        plot(1:500, M(n,:))
     
    end
    Si on optimise le tracé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    M = zeros(10000, 500);
     
    for n = 1:10000
     
        M(n,:) = rand(1,500);
     
    end
     
    figure
     
    plot(M)
    C'est un exemple théorique. Il faut bien entendu s'adapter à chaque cas spécifique.
    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)

  8. #8
    Membre à l'essai
    Homme Profil pro
    M2
    Inscrit en
    Janvier 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : M2

    Informations forums :
    Inscription : Janvier 2018
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Merci Jérôme, très pratique !

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

Discussions similaires

  1. [Débutant] Get Set de multiples variables dans une classe
    Par lupus5 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 30/05/2016, 07h41
  2. Imputation multiple Variables catégorielles
    Par ferari dans le forum SAS STAT
    Réponses: 2
    Dernier message: 03/01/2016, 06h52
  3. Multiples vérifications sur multiples variables
    Par Morby dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 03/01/2012, 17h25
  4. [matlab] Equation différentielle à multiples variables
    Par Bulveye dans le forum Mathématiques
    Réponses: 1
    Dernier message: 10/02/2011, 14h46
  5. [EJBQL] Multiple Variable et ClassCastException
    Par alfsalim dans le forum Java EE
    Réponses: 4
    Dernier message: 23/12/2005, 16h40

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