当原始数据x,y都是一维的,但不知道z关于x、y的表达式,却有与x、y一一对应的一维数组z,这种情况要怎么画三维曲面图呢?
答:插值。把x、y、z都扩充成二维的就能画出三维曲面了
插值里面比较好用的函数,当属 griddata:
A=[1.486,3.059,0.1;2.121,4.041,0.1;2.570,3.959,0.1;3.439,4.396,0.1;
4.505,3.012,0.1;3.402,1.604,0.1;2.570,2.065,0.1;2.150,1.970,0.1;
1.794,3.059,0.2;2.121,3.615,0.2;2.570,3.473,0.2;3.421,4.160,0.2;
4.271,3.036,0.2;3.411,1.876,0.2;2.561,2.562,0.2;2.179,2.420,0.2;
2.757,3.024,0.3;3.439,3.970,0.3;4.084,3.036,0.3;3.402,2.077,0.3;
2.879,3.036,0.4;3.421,3.793,0.4;3.953,3.036,0.4;3.402,2.219,0.4;
3.000,3.047,0.5;3.430,3.639,0.5;3.822,3.012,0.5;3.411,2.385,0.5;
3.103,3.012,0.6;3.430,3.462,0.6;3.710,3.036,0.6;3.402,2.562,0.6;
3.224,3.047,0.7;3.411,3.260,0.7;3.542,3.024,0.7;3.393,2.763,0.7];
x=A(:,1);y=A(:,2);z=A(:,3);
figure(1)
%三维散点图
scatter3(x,y,z)
figure(2)
%二维散点图(第三维用颜色体现)
scatter(x,y,115,z)
figure(3)
%伪彩色图
[X,Y,Z]=griddata(x,y,z,linspace(min(x),max(x))',linspace(min(y),max(y)),'v4');%插值
%griddata起自动差值的作用,这样才能画出来一个三维面
%[X,Y,Z]=griddata(x,y,z,XI,YI,'v4'):这里要求XI为行向量,YI为列向量,'v4'属性用于生成平滑曲面
%linspace(x,y)是自动生成从x到y的100数组成的列向量
pcolor(X,Y,Z);
shading interp;%过渡均匀化,去掉网格线
%colormap (flipud(jet(24)))%这个可以翻转颜色
figure(4)
%等高线图
contourf(X,Y,Z)
figure(5)
%三维曲面
surf(X,Y,Z)
下面奉上效果:
笔者此时使用的是2016b版MATLAB,2018b也是支持的,但官网文档说的未来可能会删除部分语法,如果大家发现语法失效,可以自行去官网查看griddata函数的最新用法(或者曲线救国下回老版