bonjour,
j'aurais besoin de spécifier la couleur correspondant à la valeur nulle d'une matrice que j'affiche par la commande "surf".
Quelqu'un a-t-il déjà été confronté à ce problème ?
Merci
bonjour,
j'aurais besoin de spécifier la couleur correspondant à la valeur nulle d'une matrice que j'affiche par la commande "surf".
Quelqu'un a-t-il déjà été confronté à ce problème ?
Merci
bonjour
désolé pour cette explication peu explicite.![]()
En fait je créé un maillage par la commande meshgrid.
J'affiche ensuite les valeurs d'une matrice dans ce maillage par la commande :
j'utilise la colormap par défaut, j'ai donc un dégradé de bleu (pour la valeur min de la matrice) au rouge (pour la valeur max).
Code : Sélectionner tout - Visualiser dans une fenêtre à part surf(X,Y,matrice)
Ce que je souhaiterai c'est que la valeur 0 soit représentée par une couleur spécifique (par exemple du blanc) afin de bien la différentier (je doit repérer quels sont les éléments de mon maillages contenant la valeur nulle).
En tout cas merci d'avoir répondu si vite Dumatlab.![]()
Bonjour,
Pour cela tu dois modifier juste les valeurs de colormap correspendants au niveau 0 de la matrice:
le colormap contient 64 couleurs
le min de la matrice est représenté par la couleur definie par le premier triplet de colormap, et le max par le dernier triplet.
donc il y a un triplet qui repésente le zero, apres un petit calcule, on trouve:
donc:
Code : Sélectionner tout - Visualiser dans une fenêtre à part i=(max-64*min)/(max-min)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 a=max(z(:)); b=min(z(:)); i=round((a-64*b)/(a-b)); map=colormap; map(i,:)=1; % blanc colormap(map); surf(x,y,z);
merci pour cette réponse.![]()
Mais il me semble que pour une colormap de 64 couleurs, une couleur représente toutes les valeurs comprises dans l'intervalle correspondant.
Si je prend par exemple une plage de valeurs de 0 à 10, la première couleurs de la colormap représentera les valeurs de 0 à 10/64=0.15625. Donc si j'ai dans ma matrice une valeur de 1e-3, elle sera blanche.![]()
Est-ce que c'est bien ça ?
Si c'est le cas, la méthode que tu m'as donné ne me permettrai pas de représenter uniquement la valeur 0 ?![]()
A moins que je puisse superposer deux colormap. Dans ce cas, j'utiliserai la colormap de base, puis je superposerai la colormap modifiée par ta méthode en changeant l'échelle pour que seule la valeur 0 soit représentée en blanc.![]()
Si c'est possible...
merci encore
Bonjour,
une solution à tester :
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 z=rand(50); z(15:35,15:35)=0; figure colormap(jet) s=surf(z) axis equal tight off colorbar figure colormap([ 1 1 1 ; jet]); z(~z)=-(a-b)/64; s=surf(z) axis equal tight off c=colorbar; set(c,'ylim',[0 1])
merci pour cette solution
ça a l'air de fonctionner pas mal
Il y a quelques points de la matrice qui sont affichés blancs alors qu'ils ne sont pas nuls mais j'ai testé vite fais...
Je vais m'y plonger plus serieusement maintenant pour voir si je m'en sort.
Merci encore.
![]()
Bonsoir,
absolument.Si je prend par exemple une plage de valeurs de 0 à 10, la première couleurs de la colormap représentera les valeurs de 0 à 10/64=0.15625. Donc si j'ai dans ma matrice une valeur de 1e-3, elle sera blanche.
Est-ce que c'est bien ça ?
Si c'est le cas, la méthode que tu m'as donné ne me permettrai pas de représenter uniquement la valeur 0 ?
donc, il faut prendre une colormap avec n couleurs diffirentes tel que (max-min)/n soit inferieur à la valeur la plus proche de zero, en connaissant cette valeur, on peut determiner n:
donc, je propose ca:
Code : Sélectionner tout - Visualiser dans une fenêtre à part n> (max-min)/x x est la plus proche valeur de zero
remarque: x ne doit pas être trés petit, pour ne pas avoir un n trés grand
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 z=(19:-1:-19)'*(-19:19); a=max(z(:)); b=min(z(:)); n=ceil((a-b)/min(abs(z(~~z)))); i=round((a-n*b)/(a-b)); map=jet(n); map(i,:)=1; % blanc colormap(map); surf(z);
Une solution "économique" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 z=rand(50); z(15:35,15:35)=0; figure('color','w') surf(z,'facealpha','interp','alphadata',~~z) axis equal tight off colorbar;
merci pour ta réponse rostomus
En réfléchissant sur la solution de Dumatlab, j'ai pensé effectivement à avoir un intervalle plus petit. En utilisant la même méthode en remplacantpar
Code : Sélectionner tout - Visualiser dans une fenêtre à part z(~z)=-(a-b)/64;
ça avait l'air de marcher puisque dans ce cas les éléments non nuls n'étaient plus dans le premier intervalle de la colormap
Code : Sélectionner tout - Visualiser dans une fenêtre à part z(~z)=-2*(a-b)/64;
J'ai ensuite vu ta réponse et effectivement c'est plus simple de donner une colormap avec un nombre plus grand d'éléments.
![]()
Finalement la dernière méthode m'avait l'air plus simple a utiliser. Par contre elle ne fonctionnait pas mais ça m'a bien mis sur la voie. En cherchant dans la doc, j'ai fait (après avoir rempli la matrice z) :
Le seul défaut est qu'il faut définir une matrice "calque" de même taille contenant 0 dans les zones à afficher et 1 dans les zones transparentes, ce qui peut être un peu lourd dans le cas de très grosses matrices.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Z=zeros(50,50) Z(25,:)=1 Z(:,25)=1 surf(z,'facealpha','flat','alphadata',Z)![]()
(j'ai ici seulement effacé deux lignes, il faudra que je fasse proprement une matrice Z)
![]()
Lorsque j'utilisait directement le code :
j'avais le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part surf(z,'facealpha','interp','alphadata',~~z)
je pense que c'est le ~~z que matlab n'a pas aprécié
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 >> surf(z,'facealpha','interp','alphadata',~~z) ??? Value must be numeric. Error in ==> surf at 81 hh = double(graph3d.surfaceplot(args{:},'parent',cax));
Bref, j'ai obtenu ce que je voulais![]()
merci a tous les deux
PS : est-ce que c'est moi qui cloture la discussion?
rebonjour
Je me permet de réouvrir la discussion, je ne sais pas si j'ai bien fait...
Il s'agit d'un détail qui a son importance...
La transparence est décalée par rapport à la matrice d'origine.![]()
Je créé une matrice calque à partir de la matrice d'origine :
Dans la première partie j'ai copié la matrice d'origine dans calque.
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 % creation de la matrice calque calque=matrice; calque(~~calque)=1; figure('color','w') map=jet(64); colormap(map); [YY3,ZZ3]=meshgrid(grilleY,grilleZ); surf(YY3,-ZZ3,matrice','facealpha','flat','alphadata',calque') view(2) axis equal title('YZ') xlabel('y (m)') ylabel('z (m)') colorbar
J'ai ensuite mis 1 à tous les termes non nuls pour qu'ils soient opaques.
Lorsqu'on fait l'affichage, la transparence est décalée de 1 rang à droite et de 1 rang en bas.
J'ai résolut le problème en faisant :
Mais ce n'est pas très propre. Je n'ai pas trouvé d'explications à ce décalage... Si quelqu'un a une idée...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 % creation de la matrice calque calque=matrice(2:size(matrice,1),2:size(matrice,2)); calque=[calque ones(size(calque,1),1)]; calque=[calque ; ones(1,size(calque,2))]; calque(~~calque)=1;
C'est assez simple... mais c'est écrit en anglais dans la documentation de l'objet SURFACE à la propriété FaceAlpha ... allons un petit effort :
C'est exactement ce qui arrive avec la solution "économique"flat — The values of the alpha data (AlphaData) determine the transparency for each face. The alpha data at the first vertex determine the transparency of the entire face.
j'ai honte ...
![]()
La prochaine fois je ferai plus attention. En plus je suis passé une dizaine de fois sur cette page de doc.![]()
Merci encore
Partager