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 :

utilisation de bar3 [Débutant]


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut utilisation de bar3
    Bonjour,

    J'ai crée deux histogrammes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [n1,x1]=hist(S0,70);
    bar(x1,n1/max(n1));
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [n2,x2]=hist(S1,70);
    bar(x2,n2/max(n2));
    En gros x représente un nombre et n le nombre de fois qu'il apparait.

    Maintenant je voudrais les représenter sur un même histogramme avec la fonction bar3 où on aurait sur l'axe z (la profondeur) les 2 histogrammes précédents.

    J'ai essayé plusieurs code comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X=[x1;x2]
    N=[n1,N2]
    bar3(X,N)
    mais bien sur, ça ne fonctionne pas car il faut que X soit un vecteur, et si je fais

    ce n'est évidemment pas ce que je souhaite avoir.

    Merci de votre aide,
    Cordialement,
    paul_fbm

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 889
    Points
    52 889
    Par défaut
    Les variables x1 et x2 ont-elles les mêmes dimensions ?
    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)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Tout à fait oui, elles ont les mêmes dimensions

  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 304
    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 304
    Points : 52 889
    Points
    52 889
    Par défaut
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    X=[x1(:) x2(:)];
    N=[n1(:) n2(:)];
    bar3(X,N)
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    j'ai déja essayé j'ai une erreur me disant que X doit être un vecteur.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 889
    Points
    52 889
    Par défaut
    Le problème, si j'ai tout bien compris, c'est que les valeurs de x1 et celles de x2 sont différentes.

    Dans ce cas, il faut faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    X = [1 4 ; 2 5 ; 3 6];
    N = [1 4 ; 4 2 ; 3 4];
     
    uX = unique(X(:));
     
    % NN = zeros(numel(uX),2);
    NN(X(:,1),1) = N(:,1);
    NN(X(:,2),2) = N(:,2);
     
    figure
    bar3(uX,NN)
    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)

  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 304
    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 304
    Points : 52 889
    Points
    52 889
    Par défaut
    Si tu ne veux pas voir les barres à 0 :
    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
     
    X = [1 4 ; 2 5 ; 3 6];
    N = [1 4 ; 4 2 ; 3 4];
     
    uX = unique(X(:));
    nuX = numel(uX);
     
    NN = zeros(nuX,2);
    NN(X(:,1),1) = N(:,1);
    NN(X(:,2),2) = N(:,2);
     
    alph = zeros(6*nuX,4,2);
     
    for n=1:size(X,1)
       idx = 6*(X(n,1)-1)+1:6*X(n,1)
       alph(idx,:,1) = 1;
       idx = 6*(X(n,2)-1)+1:6*X(n,2);
       alph(idx,:,2) = 1;
    end
     
    figure
    b = bar3(uX,NN);
     
    for n=1:numel(b)
        set(b(n),'AlphaData',alph(:,:,n),'facealpha','interp','edgealpha','flat')
    end
    Les codes que je donne ici ne fonctionne que si X ne contient que des valeurs entières...
    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
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Merci pour ton aide.
    Moi mes valeurs ne sont pas entières.

    J'ai décidé de procéder autrement:

    Je créé une matrice que j'appelle DS0 de taille 5x1200
    En gros je veux tracer un histogramme à l'aide de bar3 avec les 5 composantes de DS0 sur l'axe z.

    Si je fais mon programme avec une matrice quelconque, pas de problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    M=[1,5,4,6,6,8,8,2,3,11;5,3,3,6,6,7,1,1,1,4];
    [n x]=hist(M);
    bar3(x,n);
    Avec DS0 je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [n x]=hist(DS0,15);
    bar3(x,n);
    Et c'est comme si je n'avais pas fait de bar3 mais bar, j'ai un simple histogramme.

    Au fait,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (yDS1(i,j)>=e&&yDS1(i,j)<e+0.05)
    veut bien dire qu'il faille que e<yDS1<e+0.05 nan?

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 889
    Points
    52 889
    Par défaut
    Repartons d'un exemple simple...

    Pourquoi ne pas faire simplement ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    S = rand(1,250);
     
    n1 = hist(S(S<.5),10);
    n2 = hist(S(S>=.5),10);
    N = [n1(:) n2(:)];
     
    % [n1,x1] = hist(S(S<.5),10);
    % [n2,x2] = hist(S(S>=.5),10);
    % X = [x1(:) x2(:)];
     
    figure
    bar3(N)
    La numérotation de 1 à 10 pose-t-elle problème ?
    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)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    En fait pour chaque ligne, j'ai une sorte de gaussienne centrée en 0.
    Ta technique marche, sauf que la distribution est décalée (je sais pas si c'est clair).
    A mon avis c'est ce à quoi servait le x

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Le problème qu'il me reste est le suivant:
    J'ai créé un algorithme pour créer la matrice DS0.
    Le problème est que vu la façon avec laquelle je la créé, chaque ligne de la matrice ne contient pas le même nombre d'éléments, donc matlab prend comme référence la plus grande et complète les autres avec des 0 pour avoir le même nombre d'éléments dans chacune d'elles.
    Or ça me déforme mes résultats pour la suite car comme je l'ai dis, je dois obtenir une gaussienne centrée en 0 et donc il va y avoir un surplus de 0.
    Quand je trace mon histogramme après on ne vois plus que la barre correspondant à 0.
    Je ne vois pas trop comment m'en sortir.

    voici mon programme pour la matrice:

    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
    k=1;
    l=1;
    DS0=0;
    for e=-200:10:200
        for i=1:1:1023
            for j=1:1:1279
                if (yDS0(i,j)>=e&&yDS0(i,j)<e+10)
                    DS0(k,l)=xDS0(i,j);        
                    l=l+1;
                else
                end
            end
            j=1;
        end
        k=k+1;
        l=1;
    end

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 889
    Points
    52 889
    Par défaut
    Mets les variables x1, x2, n1 et n2 (ou S0 et S1) dans un fichier mat, et attache ce fichier en l'incluant dans une archive zip ou rar
    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)

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Bonjour,
    Tout d'abord, merci pour tout le temps que tu m'as consacré.
    Il y a la matrice que je veux mettre en histogramme,
    le programme que j'utilise pour tracer l'histogramme.
    J'ai donc des données centrées en 0, mais je ne veux pas que les valeurs 0 (qui ont été ajoutées
    pour "remplir les cases vides". Seules les valeurs valant 0 ont été rajoutées.
    Cordialement.
    paul_fbm

    EDIT:
    J'ai trouvé une facon plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DS1=reshape(DS1,42196,21);
    [N X] = hist(DS1,50);
    figure
    bar3(X,N./max(max(N)))
    En fait le problème avant était que l'histogramme allait de 1 à 42196 donc on ne voyait rien c'etait bcp trop étiré et je pouvais juste jouer sur "la largeur" avec hist(DS1,50)
    J'ai donc fait un reshape de la matrice pour pouvoir avoir une meilleur vision de l'histogramme.
    Je sais pas si c'est clair mais en tout cas ca me convient.

    Il me reste plus que le problème des 0.

    EDIT2
    C'est bon en fait j'ai trouvé.
    J'ai fait un programme qui fait mettre toutes les valeurs 0 à 1 et ensuite comme mes valeurs etaient comprises entre -0.2 et 0.2 j'affiche l'axe dans cet intervalle.

    EDIT3
    Je souhaiterais que les valeurs qui sont à zéro ne soient pas colorées, comme tu me le proposais avant, mais je n'ai pas compris ton code. Pourrais tu m'expliquer s'il te plait?
    Merci
    Fichiers attachés Fichiers attachés

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    ou dit autrement, je voudrais que les bars à 0 ne s'affichent pas.
    Merci

  15. #15
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 889
    Points
    52 889
    Par défaut
    Essaie ceci :

    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
    29
    30
    31
    32
    33
    load N
    load S1
     
    n1 = hist(DS11(1,:),50);
    n2 = hist(DS11(2,:),50);
    n3 = hist(DS11(3,:),50);
    n4 = hist(DS11(4,:),50);
    n5 = hist(DS11(5,:),50);
    n6 = hist(DS11(6,:),50);
    n7 = hist(DS11(7,:),50);
    n8 = hist(DS11(8,:),50);
    n9 = hist(DS11(9,:),50);
    n10 = hist(DS11(10,:),50);
    N = [n1(:) n2(:) n3(:) n4(:) n5(:) n6(:) n7(:) n8(:) n9(:) n10(:) ];
     
    % [n1,x1] = hist(S(S<.5),10);
    % [n2,x2] = hist(S(S>=.5),10);
    % X = [x1(:) x2(:)];
     
    figure
    b = bar3(N./max(max(N)));
    axis([0 10.5 0 60 0 0.002]);
     
    for n=1:numel(b)
     
       z = get(b(n),'zdata');
       alph = any(z,2);
       alph = strrep(alph,[0 1 1 0],[1 1 1 1]).';
       alph = repmat(alph,1,4);
     
       set(b(n),'AlphaData',double(alph),'facealpha','flat','edgealpha','flat')
     
    end
    Ce n'est pas encore tout à fait parfait...
    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)

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Merci, j'obtiens exactement le résultat que je souhaitais.
    Je poste le code en entier, si ça peut aider quelqu'un.

    Cordialement,
    Paul_fbm

    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
    29
    30
    31
    32
    33
    34
    35
    36
    A=size(DS0);
    %la je remplace tous les 0 par des 1 car mes données sont comprises entre -0,2 et 0,2
    for i=1:1:A(1)
        for j=1:1:A(2)
            if DS0(i,j)==0
               DS0(i,j)=1;
            end
        end
        i=1;
    end
     
    %je transforme la matrice n*m en matrice m*n car m>>n et comme ca je peux "compresser" lors de l'affichage, sinon l'histogramme serait semblable à un trait.
    DS0=reshape(DS0,A(2),A(1));
     
    [N0 X0] = hist(DS0,60); %justement je choisis de rassembler les m nombres en 60
     
    %maintenant je modifie N0 pour pas que les 1  disparaissent ( Les 1 ont été créés qd j'ai remplacé les 0 )
    C0=size(N0);
    N0=N0(1:C0(1)-1,:);
    B0=size(X0);
    X0=X0(1:B0(1)-1);
    figure
    b=bar3(X0,N0./max(max(N0)));
    axis([0 81 -0.5 0.5 0 1]);
     
    %le code pour ne pas afficher les bar qui font 0 de hauteur.
    for n=1:numel(b)
     
       z = get(b(n),'zdata');
       alph = any(z,2);
       alph = strrep(alph,[0 1 1 0],[1 1 1 1]).';
       alph = repmat(alph,1,4);
     
       set(b(n),'AlphaData',double(alph),'facealpha','flat','edgealpha','flat')
     
    end

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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