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:
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.
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');
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);
... 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;
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:
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;
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:
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
):
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
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).
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