# Further processing of contour plot data

5 views (last 30 days)
Steffen B. on 12 Jan 2023
Commented: Bjorn Gustavsson on 16 Jan 2023
Hello,
I would like to analyse a contour plot data.I’m trying to divide the contour plot into 4x3 pieces, calculate the mean for every data “rectangle” (4x3 rectangles=12 mean values).
I gather the contour data with this code below:
clc,close all
x = linspace(-pi,pi);
y = linspace(0,2*pi);
[X,Y] = meshgrid(x,y);
Z = sin(X) + cos(Y);
[C,h] = contourf(X,Y,Z,10) I'm struggeling to code the divison of the contour data into smaller areas, with subsequent mean calculation.
Maybe someone has a clue to achieve this
Greetings
Steffen

Mathieu NOE on 12 Jan 2023
hello
maybe this ? clc,close all
clearvars
N = 100; % <= added
x = linspace(-pi,pi,N);
y = linspace(0,2*pi,N);
[X,Y] = meshgrid(x,y);
Z = sin(X) + cos(Y);
figure(1)
[C,h] = contourf(X,Y,Z,10);
hold on
% let(s do a 4 x 3 area division and compute the individual cells average
Nx = 4;
Ny = 3;
dx = floor(N/Nx);
dy = floor(N/Ny);
for ci = 1:Nx
for cj = 1:Ny
indX = (1:dx)+(ci-1)*dx;
indY = (1:dy)+(cj-1)*dy;
% centroid of cell
xc = mean(x(indX));
yc = mean(y(indY));
% mean of submatrix
Zmean(ci,cj) = mean(Z(indX,indY),'all');
plot(xc,yc,'*r','Markersize',15);
t = text(xc+0.15,yc+0.15,num2str(Zmean(ci,cj),3),'FontSize',14,'Color','r');
end
end
##### 2 CommentsShowHide 1 older comment
Mathieu NOE on 16 Jan 2023
as always, my pleasure !

Bjorn Gustavsson on 12 Jan 2023
I would not do the average of the contours in a region, because if you have a rather flat region with a single spike in some region you will have very few contours at the flat level, but a large number of contours and contour-points around the spike. If you then take the average of the z-levels of the contour-points it will be significantly skewed away from the flat level. I would make some surface-fit from the conours, either with the spline-fitting functions spap2, spapi, spaps, csaps or tpaps, or use scatteredInterpolant or griddata - because that way I would obtain a sampling that is regular in the x and y-directions.
Regardless of approach you'll need something that extracts the x y and z coordinates from the contours. For this you'll need something like the function extract_contours (attached).
Using this I'd do something like this:
% Mocking up some data:
x = 1:123;
y = 1:123;
z = peaks(123);
nC = 10;
C = contour(x,y,z,nC); % this give us a contour-data-set
[xC,yC,zC] = extract_contours(C); % extracting contour-levels
F = scatteredInterpolant(cell2mat(xC)',cell2mat(yC)',cell2mat(zC)','natural');
xi = 1:2:123;
[xi,yi] = meshgrid(xi);
zi = F(xi,yi); % calculating the interpolated values at [xi,yi]
xlims = [0, 40.5 92.3 124];
ylims = [0 82.3 124];
for i1 = (numel(ylims)-1):-1:1
for i2 = (numel(xlims)-1):-1:1
zAVG(i1,i2) = mean(zi(ylims(i1)<yi(:,1)&yi(:,1)<ylims(i1+1),xlims(i1)<xi(1,:)&xi(1,:)<xlims(i2+1)),'all','omitnan');
end
end
If you want to average over the contours you could proceed something like this after the contour-extraction:
xAll = cell2mat(xC)';
yAll = cell2mat(yC)';
zAll = cell2mat(zC)';
xlims = [0, 40.5 92.3 124];
ylims = [0 82.3 124];
for i1 = (numel(ylims)-1):-1:1
for i2 = (numel(xlims)-1):-1:1
zAVG(i1,i2) = mean(zAll(ylims(i1)<yAll & ...
yAll<ylims(i1+1) & ...
xlims(i1)<xAll & ...
xAll < xlims(i2+1)),'all','omitnan');
end
end
I think that should work.
HTH
##### 2 CommentsShowHide 1 older comment
Bjorn Gustavsson on 16 Jan 2023
Well, our answers addressed two completely different problems. I interpreted your problem as if you had only the contours and wanted the averages in different regions estimated from that, and that was obviously not the problem you had. But if you happen to run into that type of problem you already have one solution here.
Cheers.

### Categories

Find more on Surface and Mesh Plots in Help Center and File Exchange

R2019b

### Community Treasure Hunt

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

Start Hunting!