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 :

Histogramme 3D


Sujet :

MATLAB

  1. #1
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut Histogramme 3D
    Bonjour,
    Comment faire non pas un histogramme 3D en matlab mais un truc qui y ressemble :
    en chaque point (x,y) avoir une barre de hauteur z ????
    "Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois

  2. #2
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [X,Y] = meshgrid(-2:.2:2, -2:.2:2);                                
    Z = X .* exp(-X.^2 - Y.^2);                
    bar3(Z)
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut Echelle des axes
    Bonjour,

    Je me permets de faire remonter ce sujet car j'utilise un code semblable à celui proposé par tug83 pour obtenir un graphe 3D en barres (en fait, mon code est plus complexe, forcément, mais je vous épargnerai les détails ^^).

    J'aimerais savoir s'il est possible de contrôler les axes d'un graphe bar3 ? Notamment de faire en sorte qu'il affiche les valeurs des vecteurs X et Y et non les numéros de leurs composantes.

    Par exemple, dans mon programme, j'ai un vecteur X=-1:1/5:1 et un vecteur Y=linspace(10,50,100). J'ai enfin une matrice Z=f(X,Y).
    Avec mesh(X,Y,Z), MatLab m'affiche bien les valeurs de X et de Z sur les axes correspondants, mais avec bar3(Z), ces valeurs vont de 1 à 11 en X et de 1 à 100 en Z. En plus, le graphe est tout écrasé suivant X (forcément, y a 10 fois moins de valeurs), ce que je ne veux pas !

    Dernière chose : on peut changer les couleurs de bar3 pour qu'elle évolue en hauteur, et non de droite à gauche ?

    Merci beaucoup !!

  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
    Pour le premier problème, ce n'est pas très clair. Je pense qu'un petit exemple nous aidera.

    Pour le second problème, voici deux codes différents :

    Le premier fait varier la couleur de chaque barre du min au max :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    M=rand(5,5);
     
    figure
     
    h=bar3(M);
     
    for n=1:numel(h)
     
         cdata=get(h(n),'zdata');
         set(h(n),'cdata',cdata,'facecolor','interp')
     
    end
    Le second code attribue une couleur à chaque barre en fonction de la valeur de Z :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    M=rand(5,5);
     
    figure
     
    h=bar3(M);
     
    for n=1:numel(h)
     
         cdata=get(h(n),'zdata');
         cdata=repmat(max(cdata,[],2),1,4);
     
         set(h(n),'cdata',cdata,'facecolor','flat')
     
    end
    Ces codes ont été testés sous la version 6.1 (R12.1). Il se peut que la fonction BAR3 retourne des objets de types différents dans les versions plus récentes... à adapter comme toujours...
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    Merci pour tes solutions ! Les deux fonctionnent sous la version 7.0 (celle que j'utilise), et la deux est plus appropriée à mon travail. Et j'arrive presque à tout comprendre ce que les différents termes signifient ^^ (je suis débutante mais je me soigne )

    Pour mon 1er problème, voilà une version simplifiée de mon code, pour exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    X=-1:1/5:1 ;
    Y=linspace(10,50,100) ;
    N=(Y-Y(1))*tan(1.5*pi/180) ;
     
    for j=1:length(X)
        for i=1:length(Y)
            Z(i,j)=real(sin(acos(X(j)-N(i)))) ;
        end
    end
     
    figure(1) ; mesh(X,Y,Z)
    figure(2) ; bar3(Z)
    Avec mesh, les valeurs données sur les axes correspondent bien aux valeurs de X et de Y.
    Avec bar3, on dirait qu'il essaye de garder la même échelle pour les deux axes X et Y, et en plus il ne met pas les valeurs mais compte de 1 à length(X) ou length(Y)... J'aimerais avoir les mêmes axes qu'avec le graphe mesh, c'est possible ?... Parce que là, c'est pas très joli et pas facile à étudier...

  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 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
    Ce n'est pas très évident à faire... il faut manipuler les propriétés DataAspectRatio et PlotBoxAspectRatio de l'objet Axes.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    figure(2) ; bar3(Z)
    set(gca,'PlotBoxAspectRatio',[1 1 1])
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut On va dire qu'en ce qui me concerne, c'est résolu
    Mmm... bon, alors si même quelqu'un comme toi dit que ce n'est pas évident, je vais p't-être pas m'amuser à creuser pour l'instant ^^ D'autant plus qu'avec le code que tu m'as donné, ma figure est déjà beaucoup plus lisible. Je n'ai toujours pas la valeur de chaque X (ou Y) en lieu et place de chacune de leur position dans le vecteur, sur l'axe correspondant, mais tant pis. Je pense que mon maître de stage sera quand même un peu satisfait de ce que j'ai réussi à obtenir.

    Merci beaucoup pour ton aide !!!

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut Inversion des axes
    Re bonjour !!

    J'ai donc mon graphe en barres obtenu grâce à l'aide de Dutmatlab, dont voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    figure ; h=bar3(Z) ;
    for n=1:numel(h)
         cdata=get(h(n),'zdata') ;
         cdata=repmat(max(cdata,[],2),1,4) ;     
         set(h(n),'cdata',cdata,'facecolor','flat') ;
    end
    set(gca,'PlotBoxAspectRatio',[1 1 1])
    Sauf que j'aimerais inverser l'axe Y, pour visualiser la figure directement dans l'autre sens. J'ai essayé d'utiliser la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(gca,'YDir','reverse')
    mais même en la plaçant à différents endroits de mon code pour ma figure, MatLab persiste à ne rien changer... Je sais pas quoi faire

    (au fait, si c'est gênant que j'utilise le même topic sur les histogrammes en 3D pour différentes questions dessus, dites-le moi ^^)

  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 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 Patchanka
    mais même en la plaçant à différents endroits de mon code pour ma figure, MatLab persiste à ne rien changer... Je sais pas quoi faire
    C'est normale, la propriété YDir a déjà la valeur Reverse. Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(gca,'YDir','normal')
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    J'avais vu que c'était déjà en reverse, en modifiant les propriétés des axes à partir de la figure, mais j'avais pas pensé à ça ! Ca marche maintenant, merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/01/2005, 10h53
  2. [CR8.5] Graphique : comment mélanger histogramme et ligne ?
    Par kiki26 dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 18/01/2005, 15h28
  3. TChart et histogramme
    Par coucoucmoi dans le forum Composants VCL
    Réponses: 8
    Dernier message: 30/08/2004, 16h10
  4. Questions sur chartfx (histogramme)
    Par lejert dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/01/2004, 13h54
  5. [TChart] comment remplir un histogramme avec du rouge strié.
    Par :GREG: dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 09h37

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