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 ????
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 ????
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)
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 !!
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 :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 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') endCes 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...
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
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 :
Avec mesh, les valeurs données sur les axes correspondent bien aux valeurs de X et de Y.
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 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...
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])
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 !!!
Re bonjour !!
J'ai donc mon graphe en barres obtenu grâce à l'aide de Dutmatlab, dont voici mon code :
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
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])
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part set(gca,'YDir','reverse')
(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 ^^)
C'est normale, la propriété YDir a déjà la valeur Reverse. Essaie ceci :Envoyé par Patchanka
Code : Sélectionner tout - Visualiser dans une fenêtre à part set(gca,'YDir','normal')
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager