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:
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.
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');
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);
... 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;
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:
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;
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:
É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
):
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
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).
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 faceted
pcolor()
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