web-dev-qa-db-fra.com

Matlab comment faire un tracé de contour lisse?

Je veux représenter des données avec 2 variables au format 2D. La valeur est représentée par la couleur et les 2 variables comme les 2 axes. J'utilise la fonction contourf pour tracer mes données:

clc; clear;

load('dataM.mat')

cMap=jet(256); %set the colomap using the "jet" scale
F2=figure(1);
[c,h]=contourf(xrow,ycol,BDmatrix,50);
set(h, 'edgecolor','none');

xlim([0.0352 0.3872]);
ylim([0.0352 0.3872]);

colormap(cMap);
cb=colorbar;
caxis([0.7 0.96]);
% box on;
hold on;

Les deux xrow et ycol sont des matrices 6x6 représentant les coordonnées. BDmatrix est la matrice 6x6 représentant les données correspondantes. Cependant, ce que je reçois est le suivant:

enter image description here

Voici les matrices xrow et yrow:

enter image description here

Voici les matrices BDmatrix:

enter image description here

Serait-il possible que la couleur du contour varie en douceur plutôt que d'apparaître comme des lignes droites reliant les points de données? Le problème de cette figure est la granularité grossière qui n'est pas séduisante. J'ai essayé de remplacer contourf par imagec mais cela ne semble pas fonctionner. J'utilise MATLAB R2015b.

7
Kelvin S

Vous pouvez interpoler vos données.

newpoints = 100;
[xq,yq] = meshgrid(...
            linspace(min(min(xrow,[],2)),max(max(xrow,[],2)),newpoints ),...
            linspace(min(min(ycol,[],1)),max(max(ycol,[],1)),newpoints )...
          );
BDmatrixq = interp2(xrow,ycol,BDmatrix,xq,yq,'cubic');
[c,h]=contourf(xq,yq,BDmatrixq);

Choisissez le "lissage" du nouveau tracé via le paramètre newpoints.

Plot sample

Pour réduire les bords de couleur, vous pouvez augmenter le nombre de pas de valeur. Par défaut, il s'agit de 10. Le code suivant augmente le nombre d'étapes de valeur à 50:

 [c,h]=contourf(xq,yq,BDmatrixq,50);

Sample fine

Un tracé de surf 3D serait plus approprié pour un ombrage des couleurs très lisse. Il suffit de le faire pivoter pour une vue de haut en bas. Le tracé de surf est également beaucoup plus rapide que le tracé de contour avec beaucoup d'étapes de valeur.

 f = figure;
 ax = axes('Parent',f);
 h = surf(xq,yq,BDmatrixq,'Parent',ax);
 set(h, 'edgecolor','none');
 view(ax,[0,90]);
 colormap(Jet);
 colorbar;

Sample smooth

Remarque 1: L'interpolation cubique ne préserve pas la forme. Cela signifie que la forme interpolée peut avoir des maxima supérieurs aux valeurs maximales de BDmatrix d'origine (et des minima inférieurs). Si BDmatrix a des valeurs bruyantes, l'interpolation peut être mauvaise.

Note 2: Si vous avez généré vous-même xrow et yrow (et connaître les limites), que vous n'avez pas besoin de cette extraction min-max ce que j'ai fait.

Note 3: Après avoir ajouté des captures d'écran de vos matrices de données à votre publication d'origine, on peut voir que xrow et ycol proviennent d'un générateur ndgrid. Nous devons donc également l'utiliser ici afin d'être cohérent. Puisque interp2 a besoin meshgrid nous devons passer à griddedInterpolant:

[xq,yq] = ndgrid(...
            linspace(min(min(xrow,[],1)),max(max(xrow,[],1)),newpoints ),...
            linspace(min(min(ycol,[],2)),max(max(ycol,[],2)),newpoints )...
          );
F = griddedInterpolant(xrow,ycol,BDmatrix,'cubic');
BDmatrixq = F(xq,yq);
9
Loamsiada