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 :

[bar] Intervalle pour histogramme


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut [bar] Intervalle pour histogramme
    Bonjour tout le monde,

    J'aurais une petite question concernant la représentation d'un graphique. Je souhaiterais avoir un histogramme. J'ai regardé les fonctions hist et bar mais sans trouver ce que je cherche.

    J'aimerais pouvoir tracer un histogramme avec des valeurs de x fluctuantes...
    Par example prenons une étude sur l'age. 15 % des personnes ont entre 0 et 10 ans, 27 % on entre 10 et 15 etc...

    Comment peut-on le représenter? Sachant que les intervalles ne sont pas égaux entre eux? 10 ans et 5 ans dans notre example?

    Si je définie deux vecteurs. Y avec le pourcentage et X avec l'âge, j'arrive à ceci pour le moment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Y=[15 27];
    X=[0 15];
    bar(X,Y)
    Deux belles barres centrées en 0 et 15... alors qu'il me faudrait une barre centrée sur 5 et de largeur 0 à 10 et une barre centrée sur 12.5 de largeur 10 à 15.... Est-ce possible?

  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 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 : 53 165
    Points
    53 165
    Par défaut
    Comme 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
    Y=[15 27];
    X=[0 10
       10 15];
     
    figure
     
    b=bar(Y)
     
    h=get(b,'children');
     
    v=get(h,'vertices');
    f=get(h,'faces');
     
    for n=1:numel(Y)
        v(f(n,1:2),1)=X(n,1);  
        v(f(n,3:4),1)=X(n,2);
    end
     
    set(h,'vertices',v);
     
    set(gca,'xtick',unique(X(:)))
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Merci pour la réponse rapide Dut. J'ai mis un peu de temps avant de tout comprendre et de le retranscrire sur mes véritables données mais c'est bien ce que je cherchais à faire. Je vais essayé de perfectionner un peu tout ca en mettant un espace entre les barres histoire de rendre ca plus lisible.

    Par contre, je n'arrive pas à comprendre pourquoi dans le v(f( etc)) matlab garde en mémoire quelques valeurs "résiduelles ? " comme v(1,1)=0.5 dans mon cas et c'est seulement v(2,1) qui vaut -1. Ca provient des valeurs de la matrice f mais pourquoi elle ne commence pas à 1 ? Enfin, c'est pas le plus important.

    Autre petite question pendant que j'y suis. Peut-on modifier la couleur d'une seule barre en passant par le set(gca)?

    Encore merci en tout cas.

  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 : 53 165
    Points
    53 165
    Par défaut
    Citation Envoyé par Merel Voir le message
    Peut-on modifier la couleur d'une seule barre en passant par le set(gca)?
    Non, il faut encore manipuler les propriétés des objets Patch produits par BAR :

    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
    Y=[15 27 5];
    X=[0 10
       10 15
       15 30];
     
    figure
     
    b=bar(Y)
     
    h=get(b,'children');
     
    v=get(h,'vertices');
    f=get(h,'faces');
     
    for n=1:numel(Y)
        v(f(n,1:2),1)=X(n,1);  
        v(f(n,3:4),1)=X(n,2);
    end
     
    fvcd=get(h,'facevertexcdata');
    couleurs=1:size(f,1)
    fvcd(f(:,1))=couleurs;
     
    set(h,'vertices',v,'facevertexcdata',fvcd);
     
    set(gca,'xtick',unique(X(:)))
    Prend le temps de lire la documentation à propos de ces objets graphiques très puissants.
    Leur manipulation est assez complexe, je le reconnais
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Oui, c'est sur, c'est assez compliqué pour tout comprendre... Mais c'est vrai qu'une fois qu'on doit les connaitre, ca a l'air d'être puissant.

    En tout cas, merci beaucoup. Et je vais me replonger dans mes bouquins pour être au point la dessus. Je n'aime pas utiliser des codes quand je ne comprends pas le pourquoi du comment !

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    La solution de Dut est sûrement plus souple mais on aurait pu utiliser la fonction histc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    age=[1 2 9 14 13 3]
    intervalle=[0 5 15]
    [Y,pas_utile]=histc(age,intervalle)
    bar(intervalle,Y,'histc')
    ZiK un lecteur audio et son blog.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Merci à vous deux pour vos réponses. Même si la réponse de vinc-mai est plus simple, je préfère celle de Dut. J'ai l'impression comme ca d'avoir un contrôle total sur les paramètres que je souhaite modifier.

    A ce propos, j'ai une dernière question avant de fermer ce sujet.

    J'ai réussi sur mes données à faire de jolies graph en deux couleurs, bleu et rouge. J'aimerais maintenant ajouter une légende avec ces deux couleurs et je n'y arrive pas....

    J'ai bien utilisé la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [LEGH,OBJH,OUTH,OUTM] = LEGEND(...)
    pour récupérer toutes les informations du graphes mais ca ne marche pas. Si je mets deux strings en arguments, matlab me renvoie un warning en me disant qu'il n'y a qu'un parmètre (la couleur bleu) et ignore donc l'autre string.

    Peut on manuellement ajouter une deuxième légende pour mes barres couleur rouge?

    Pour info, j'arrive à modifier la couleur de la légende mais si je fais ca, tout mon graphe change de couleur...

  8. #8
    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 : 53 165
    Points
    53 165
    Par défaut
    Il faut parfois savoir mentir un peu avec MATLAB


    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
    Y=[15 27 5];
    X=[0 10
       10 15
       15 30];
    
    figure
    
    b=bar(Y);
    
    h=get(b,'children');
    
    v=get(h,'vertices');
    f=get(h,'faces');
    
    for n=1:numel(Y)
        v(f(n,1:2),1)=X(n,1);  
        v(f(n,3:4),1)=X(n,2);
    end
    
    fvcd=get(h,'facevertexcdata');
    couleurs=1:size(f,1);
    fvcd(f(:,1))=couleurs;
    
    set(h,'vertices',v,'facevertexcdata',fvcd);
    
    set(gca,'xtick',unique(X(:)))
    
    for n=1:3
        p(n)=patch(nan(2),nan(2),couleurs(n));
    end
    str={'A' 'B' 'C'};
    
    legend(p,str)
    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)

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    forcément.... Je cherchais un moyen d'y parvenir avec les get et set et il suffisait de faire une boucle ! Grrrr. En même temps, mentir n'a jamais été ma spécialité.

    Le point positif c'est que maintenant je peux changer n'importe quel paramètre "simple" d'une légende avec mes tests foireux.

    En tout cas, c'est parfait comme ca. Encore merci.

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

Discussions similaires

  1. Progress bar class pour recherche des fichiers
    Par Montor dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/08/2010, 19h50
  2. [XL-2010] Libellés pour histogramme avec plusieurs séries
    Par Billou265 dans le forum Excel
    Réponses: 2
    Dernier message: 01/08/2010, 18h57
  3. [AC-2003] Découpe date en intervalle pour réaliser requetes
    Par DUCKY_ dans le forum VBA Access
    Réponses: 4
    Dernier message: 15/01/2010, 15h05
  4. changement de l'intervalle pour une loi uniforme
    Par djocin dans le forum Fortran
    Réponses: 3
    Dernier message: 22/06/2009, 16h28
  5. Réponses: 0
    Dernier message: 25/09/2007, 15h11

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