필터 지우기
필터 지우기

How to arrange the correct range in colorbar in MATLAB

조회 수: 1 (최근 30일)
Torkan
Torkan 2022년 4월 7일
댓글: Mathieu NOE 2022년 4월 8일
Hello,
I have a 3D surface curvefit in matlab. The issue is for Z column the range is outside of the data range. How can I give correct range? This are my data and this is my code and actually it gives me wrong plot maybe. Would you pelase check it? Also, I want to remove the data points from the plot, how to do that?
Or if you have any other way to plot I would ppreciate it
clear all
M=readtable('tt.xlsx');
x1 = M.(1) ;
y1 = M.(2) ;
z1 = M.(3);
s = fit([x1 y1],z1,"poly23");
plot(s,[x1 y1],z1);
c = jet(20);
colormap(c);
shading interp
xlabel('HR')
ylabel('L/D')
zlabel('Fc')
colorbar

채택된 답변

Mathieu NOE
Mathieu NOE 2022년 4월 7일
hello
as I don't have the toolbox for fit, I used instead the FEX submission (excellent) from John D'Errico :
you can simply comment the line with scatter3 plot if you don't want the points on the plot
no issue so far...
code :
clear all
M=readtable('tt.xlsx');
x1 = M.(1) ;
y1 = M.(2) ;
z1 = M.(3);
s = polyfitn([x1(:) y1(:)], z1(:), 2); % File Exchange by John D'Errico : https://fr.mathworks.com/matlabcentral/fileexchange/34765-polyfitn
[xx,yy] = meshgrid(0:1:10, 0:10:400);
zz = polyvaln(s, [xx(:) yy(:)]);
zz = reshape(zz, size(xx));
% remove data outise range
ind = (zz>=max(z1));
zz(ind) = NaN;
% plot points and surface
figure('Renderer','opengl')
scatter3(x1, y1, z1,'o','filled'); % comment this line if you don't want the points
surface(xx, yy, zz, ...
'FaceColor','interp', 'EdgeColor','b', 'FaceAlpha',0.4)
AZ = -37.5;
EL = 30;
view(AZ,EL)
grid on;
colormap(jet);
shading interp
xlabel('HR')
ylabel('L/D')
zlabel('Fc')
colorbar;
  댓글 수: 5
Mathieu NOE
Mathieu NOE 2022년 4월 8일
hello again
first , a small improvement of the code
  • mesh is shown (can be removed by commenting this line :
mesh(xx, yy, zz, 'FaceAlpha',0.4)
  • meshgrid limits are computed automatically from min and max values of x1 and y1 (I took 25 steps for both directions, you can of course change that)
[xx,yy] = meshgrid(linspace(min(x1),max(x1),25), linspace(min(y1),max(y1),25));
full code :
clear all
M=readtable('tt.xlsx');
x1 = M.(1) ;
y1 = M.(2) ;
z1 = M.(3);
s = polyfitn([x1(:) y1(:)], z1(:), 2); % File Exchange by John D'Errico : https://fr.mathworks.com/matlabcentral/fileexchange/34765-polyfitn
[xx,yy] = meshgrid(linspace(min(x1),max(x1),25), linspace(min(y1),max(y1),25));
zz = polyvaln(s, [xx(:) yy(:)]);
zz = reshape(zz, size(xx));
% remove data outside range
ind = (zz>=max(z1));
zz(ind) = NaN;
% plot points and surface
figure('Renderer','opengl')
hold on
scatter3(x1, y1, z1,'o','filled'); % comment this line if you don't want the points
mesh(xx, yy, zz, 'FaceAlpha',0.4)
surface(xx, yy, zz,'FaceColor','interp', 'EdgeColor','b', 'FaceAlpha',0.4)
hold off
AZ = -37.5;
EL = 30;
view(AZ,EL)
grid on;
colormap(jet);
shading interp
xlabel('HR')
ylabel('L/D')
zlabel('Fc')
colorbar;
%% NOTA : difference between surf and surface matlab functions
% The difference is that surf checks first to see if the axes Nextplot property says to replace plot,
% and if so then it does a cla. Then either way it calls surface()
% In other words if "hold on" is not in effect (or the internal equivalent)
% then surf will erase the current plot. surface() will not do that.
% The difference is sort of like the difference between line() and plot(). line() never erases the current plot.
% plot() might erase the current plot, and whether it does or not it will call line to do the drawing work.
Mathieu NOE
Mathieu NOE 2022년 4월 8일
FYI the code works too (at least on my side) with the new data file (mmm.xlsx)
surface of order 1 :
s = polyfitn([x1(:) y1(:)], z1(:), 1); %
surface of order 2 :
s = polyfitn([x1(:) y1(:)], z1(:), 2); %

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Surface and Mesh Plots에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by