web-dev-qa-db-fra.com

Comment puis-je créer un tracé "couleur" dans matlab?

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

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

Quelle fonction de traçage matlab dois-je utiliser pour créer un graphe 2D où la variable dépendante est représentée par niquement une couleur? Je cherche quelque chose comme pm3d map dans gnuplot.

28
Dan

Par défaut, mesh colorera les valeurs de surface en fonction de (par défaut) jet colormap (c'est-à-dire que hot est supérieur). Vous pouvez également utiliser surf pour les patchs de surface remplis et définir la propriété 'EdgeColor' Sur 'None' (Les bords du patch ne sont donc 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 2D : Vous pouvez obtenir une carte 2D en changeant la propriété view de la figure.

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

enter image description here

... ou en traitant les valeurs dans Z comme une matrice, en la visualisant comme une image mise à l'échelle en utilisant imagesc et en sélectionnant un plan de couleurs approprié.

% 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 n’importe laquelle des tables de couleurs intégrées fournies par MATLAB:

enter image description here

Mettre à jour/affiner la carte : Plusieurs options de conception sur la carte (résolution, lissage, axe, etc.) peuvent être contrôlées par les options ordinaires de MATLAB. Comme @Floris le fait remarquer, voici une mappe d'étiquettes lissée, sans axe ni axe égal, adaptée à cet exemple:

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

enter image description here

42
gevang

la réponse de Gevang est excellente. Il existe également un autre moyen 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

De plus, pcolor est également plat, comme indiqué ici (pcolor est la base 2d; la figure 3D au-dessus est générée à l'aide de mesh):

enter image description here

19
Justin

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'autre part, en utilisant imagesc, vous devez faire attention aux axes. Les exemples surf et imagesc dans la réponse de gevang uniquement (presque - à part la dernière ligne et la dernière colonne) se correspondent car la fonction sinc sincère 2D est symétrique.

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

[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 10ème ligne et la 5ème colonne manquent dans le graphique de surf. (Vous pouvez également le voir en images dans les autres réponses.)

Notez que vous pouvez utiliser la commande "set (gca, 'YTick' ..." (et Xtick) pour définir correctement les libellés de coches x et y si x et y ne sont pas 1: 1: N.

Notez également que imagesc n'a de sens que si vos données z correspondent à xs et que ys sont (chacune) équidistante. Sinon, vous pouvez utiliser surf (et éventuellement dupliquer la dernière colonne, la dernière ligne et une dernière valeur "(fin, fin)" - bien que ce soit une sorte d'approche fausse).

5
stack_horst

Je suggère également 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 de dessus des barres d'histogramme.

Donc, dans mon cas, je préfère utiliser la réponse de jucestain. La valeur par défaut shading faceted De pcolor() est plus appropriée. Cependant, pcolor() n'utilise pas les dernières lignes et colonnes de la matrice tracée. Pour cela, j'ai utilisé la fonction padarray():

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

Désolé si ce n'est pas vraiment lié à la publication originale

2
Hazem