Create contour plot from scatter plot

99 vues (au cours des 30 derniers jours)
mads skibsted
mads skibsted le 23 Avr 2024
Commenté : Mathieu NOE le 24 Avr 2024
I want to create a contour from this matrix with x,y and z data. x is the length, y is the width and z is the deviatoric strain.
I want to create a contour plot instead. Is that possible?
figure; hold on ; box on
scatter(x,y,[20],-z,'filled')
ylabel('Width, \ $(\mathrm{m})$','FontSize',15); xlabel('Length, \ $(\mathrm{m})$','FontSize',15,'FontName','times')

Réponse acceptée

Voss
Voss le 23 Avr 2024
M = readmatrix('k.txt');
x = M(:,1);
y = M(:,2);
z = M(:,3);
I = scatteredInterpolant(x,y,z);
Warning: Duplicate data points have been detected and removed - corresponding values have been averaged.
N = 80;
X = linspace(min(x),max(x),N);
Y = linspace(min(y),max(y),N);
[X,Y] = meshgrid(X,Y);
Z = I(X,Y);
contour(X,Y,Z)
colorbar
  6 commentaires
Voss
Voss le 24 Avr 2024
Those are definitely improvements. Thank you!
Mathieu NOE
Mathieu NOE le 24 Avr 2024
hello @Voss
tx for the nice comment :)

Connectez-vous pour commenter.

Plus de réponses (2)

Mathieu NOE
Mathieu NOE le 23 Avr 2024
hello
sure you can do that
notice that I needed to create lot of levels to display the outer contour line because your z data is highly concentrated in the lower portion of the range (we can see that by plotting a histogram)
data = readmatrix('k.txt');
x = data(:,1);
y = data(:,2);
z = data(:,3);
histogram(z,200)
% Interpolate the scattered data
xd = linspace(min(x),max(x),100);
yd = linspace(min(y),max(y),100);
v = linspace(min(z),max(z),200); % define the levels for the contour plot
[xq,yq] = meshgrid(xd,yd);
zq = griddata(x,y,z,xq,yq);
Warning: Duplicate data points have been detected and removed - corresponding values have been averaged.
% replace NaN's generated by griddate with 0 (or a value lower than min(z)
zq(isnan(zq)) = 0;
% contour plot
[c,h] = contour(xq,yq,zq,v);
grid on
axis square
  2 commentaires
Mathieu NOE
Mathieu NOE le 23 Avr 2024
this could be an alternative , with less contour lines
now the levels are generated with a log scale
and I use clabel to show what are the corresponding z value
data = readmatrix('k.txt');
x = data(:,1);
y = data(:,2);
z = data(:,3);
% Interpolate the scattered data
xd = linspace(min(x),max(x),100);
yd = linspace(min(y),max(y),100);
% v = linspace(min(z),max(z),200); % define the levels for the contour plot
v = logspace(log10(min(z)),log10(max(z)),10);
[xq,yq] = meshgrid(xd,yd);
zq = griddata(x,y,z,xq,yq);
Warning: Duplicate data points have been detected and removed - corresponding values have been averaged.
% replace NaN's generated by griddate with 0 (or a value lower than min(z)
zq(isnan(zq)) = 0;
% contour plot
[c,h] = contour(xq,yq,zq,v);
grid on
axis square
clabel(c,h,v,'LabelSpacing',3000,'Color','b','FontWeight','bold')
colorbar('vert')
mads skibsted
mads skibsted le 23 Avr 2024
Hi, Thanks,
But it is reallt import to keep the hole in the middle. There is no contours at that area..

Connectez-vous pour commenter.


Walter Roberson
Walter Roberson le 23 Avr 2024
  3 commentaires
Mathieu NOE
Mathieu NOE le 24 Avr 2024
It works on my side but with tricontour I don't know how you can manage to keep the inner hole
data = readmatrix('k.txt');
x = data(:,1);
y = data(:,2);
z = data(:,3);
% v = linspace(min(z),max(z),20); % define the levels for the contour plot
v = logspace(log10(min(z)),log10(max(z)),50);
tri=delaunay(x,y); % triangulate scattered data
[C,h]=tricontour(tri,x,y,z,v);
% clabel(C,h)
colormap('jet');
grid on
axis square
% clabel(c,h,v,'LabelSpacing',3000,'Color','b','FontWeight','bold')
colorbar('vert')
Mathieu NOE
Mathieu NOE le 24 Avr 2024
so you probably should stick with the solution based on scatteredInterpolant

Connectez-vous pour commenter.

Catégories

En savoir plus sur Contour Plots dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by