Comment puis-je faire une" carte couleur " parcelle dans matlab?

j'ai des données (en fonction de deux paramètres) stockées dans un format matlab, et je voudrais utiliser matlab pour tracer. Une fois que j'ai lu les données, j'utilise mesh() faire un terrain. Mon mesh() plot me donne la valeur de la fonction comme une couleur et une hauteur de surface, comme ceci:

A color and a surface height as a function of two independent variables.

quelle fonction de pointage matlab dois-je utiliser pour faire un pointage 2D où la variable dépendante est représentée comme seulement une couleur? Je suis à la recherche d' quelque chose comme pm3d map dans gnuplot.

26
demandé sur Dan 2013-04-02 05:05:24

4 réponses

Par défaut mesh va colorer les valeurs de surface basées sur le (par défaut) jet palette de couleurs (c'est à dire chaud est plus élevé). Vous pouvez en outre utiliser surf pour les taches de surface remplies et mettre le 'EdgeColor' propriété 'None' (donc les bords du patch ne sont pas visibles).

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;

% surface in 3D
figure;
surf(Z,'EdgeColor','None');

enter image description here

carte en 2D: vous pouvez obtenir une carte 2D en changeant le view propriété de la figure

% 2D map using view
figure;
surf(Z,'EdgeColor','None');
view(2);    

enter image description here

... ou traitement des valeurs en Z en tant que matrice, en le regardant comme une image graduée en utilisant imagesc et en choisissant unpalette.

% using imagesc to view just Z
figure;
imagesc(Z); 
colormap jet; 

enter image description here

La palette de couleurs de la carte est contrôlée par colormap(map), où map peut être personnalisé ou l'un des colormaps intégrés fournis par MATLAB:

enter image description here

mise à Jour/Raffinage de la carte: plusieurs options de design sur la carte (résolution, lissage, axe etc.) peut être contrôlé par les options MATLAB régulières. Comme le souligne @Floris, voici une carte à axes égaux, sans axes, lissée, adaptée à cet exemple:

figure;
surf(X, Y, Z,'EdgeColor', 'None', 'facecolor', 'interp');
view(2);
axis equal; 
axis off;

enter image description here

38
répondu gevang 2013-04-02 04:26:28

la réponse de gevang est excellente. Il y a une autre façon de le faire directement en utilisant pcolor. Code:

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
figure;
subplot(1,3,1);
pcolor(X,Y,Z); 
subplot(1,3,2);
pcolor(X,Y,Z); shading flat;
subplot(1,3,3);
pcolor(X,Y,Z); shading interp;

Sortie:

enter image description here

Également pcolor est plat aussi, comme le montre ici (pcolor est la base 2d; la figure 3d au-dessus est générée en utilisant mesh):

enter image description here

19
répondu Justin 2013-04-02 04:17:59

notez que pcolor et" surf + view(2) " n'affichent ni la dernière ligne ni la dernière colonne de vos données 2D.

d'un autre côté, en utilisant imagesc, vous devez faire attention avec les haches. Les exemples de surf et d'imagesc dans la réponse de gevang seulement (presque -- à l'exception de la dernière ligne et de la dernière colonne) correspondent l'un à l'autre parce que la fonction 2D sinc est symétrique.

pour illustrer ces 2 points, j'ai produit la figure ci-dessous avec le suivant code:

[x, y] = meshgrid(1:10,1:5);
z      = x.^3 + y.^3;

subplot(3,1,1)
imagesc(flipud(z)), axis equal tight, colorbar
set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
title('imagesc')

subplot(3,1,2)
surf(x,y,z,'EdgeColor','None'), view(2), axis equal tight, colorbar
title('surf with view(2)')

subplot(3,1,3)
imagesc(flipud(z)), axis equal tight, colorbar
axis([0.5 9.5 1.5 5.5])
set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
title('imagesc cropped')

colormap jet

surf vs imagesc

comme vous pouvez le voir la 10e rangée et la 5e colonne sont manquantes dans le graphique de surf. (Vous pouvez également le voir en images dans les autres réponses.)

notez comment vous pouvez utiliser le " set (GCA,'YTick'..."(et Xtick) commande pour régler correctement les étiquettes X et y si x et y ne sont pas 1:1:n.

notez aussi que imagesc n'a de sens que si vos données z correspondent à xs et ys sont (chacune) également espacées. Si non, vous pouvez utiliser des vagues (et peut-être dupliquer la dernière colonne et la rangée et une autre valeur "(end,end)" -- bien que ce soit une sorte d'approche sale).

5
répondu stack_horst 2015-03-02 22:10:26

je suggère aussi d'utiliser contourf(Z). Pour mon problème, je voulais visualiser un histogramme 3D en 2D, mais les contours étaient trop lisses pour représenter une vue du haut des barres d'histogrammes.

donc dans mon cas, je préfère utiliser la réponse de jucestain. La valeur par défaut shading facetedpcolor() est plus approprié. Cependant, pcolor() n'utilise pas la dernière ligne et la dernière colonne de la matrice tracée. Pour cela, j'ai utilisé le padarray() fonction:

pcolor(padarray(Z,[1 1],0,'post'))

Désolé si ce n'est pas vraiment liée à l'origine post

2
répondu Hazem 2014-05-14 11:30:03