如何使用不等尺寸向量数据创建Surface Plot(曲面图)
如何用给定MATLAB数据创建曲面图
嘿,我来帮你搞定这个MATLAB曲面图的问题~首先得明确:MATLAB的surf(曲面图)函数需要三个同维度的二维矩阵:X和Y表示网格坐标,Z表示对应网格点的高度值。根据你提供的数据,我分两种常见场景来讲解:
场景1:将z值作为Y轴,样本索引作为X轴,n/m作为高度
这种场景适合你想展示不同z值下,n或m这10个样本的分布曲面:
先构造X和Y的网格矩阵:
- X轴用样本的索引(1到10),把它扩展成4行10列的矩阵(和n/m维度一致)
- Y轴用你的z值,把每个z值重复10次,形成4行10列的矩阵
直接调用
surf函数绘制曲面,代码如下:
clc; clear all; n1=rand(1,10); n2=rand(1,10); n3=rand(1,10); n4=rand(1,10); m1=rand(1,10); m2=rand(1,10); m3=rand(1,10); m4=rand(1,10); n=[n1;n2;n3;n4]; m=[m1;m2;m3;m4]; z=[0.1,0.2,0.3,0.4]; % 构造X和Y网格矩阵 X = repmat(1:10, 4, 1); % 4行10列,每行都是1-10 Y = repmat(z', 1, 10); % 4行10列,每列都是对应的z值 % 绘制n作为高度的曲面图 figure; surf(X, Y, n); xlabel('样本索引'); ylabel('z值'); zlabel('n值'); title('z值与样本索引对应的n曲面'); shading interp; % 可选:让曲面更平滑 % 如果你想绘制m作为高度的曲面,只需要把n换成m即可 figure; surf(X, Y, m); xlabel('样本索引'); ylabel('z值'); zlabel('m值'); title('z值与样本索引对应的m曲面'); shading interp;
场景2:将n作为X轴,m作为Y轴,z值作为高度(拟合散点为曲面)
如果你的需求是把每个(n_k,i, m_k,i, z_k)作为三维空间中的散点,然后拟合出连续曲面,那需要先通过插值生成网格数据:
先把所有散点整理成一维数组:
- 将n和m的4行10列矩阵转成一维,z值也对应重复10次(因为每个z对应10个点)
创建X-Y平面的网格,用
griddata函数插值得到Z矩阵,再绘制曲面:
clc; clear all; n1=rand(1,10); n2=rand(1,10); n3=rand(1,10); n4=rand(1,10); m1=rand(1,10); m2=rand(1,10); m3=rand(1,10); m4=rand(1,10); n=[n1;n2;n3;n4]; m=[m1;m2;m3;m4]; z=[0.1,0.2,0.3,0.4]; % 整理散点数据 x_scatter = n(:); % 把n转成40x1的一维数组 y_scatter = m(:); % 把m转成40x1的一维数组 z_scatter = repmat(z', 10, 1); % 每个z值重复10次,转成40x1 % 创建X-Y网格(可以调整网格密度,比如20x20) [x_grid, y_grid] = meshgrid(linspace(min(x_scatter), max(x_scatter), 20), ... linspace(min(y_scatter), max(y_scatter), 20)); % 插值得到网格对应的Z值 z_grid = griddata(x_scatter, y_scatter, z_scatter, x_grid, y_grid, 'cubic'); % 绘制曲面 figure; surf(x_grid, y_grid, z_grid); xlabel('n值'); ylabel('m值'); zlabel('z值'); title('n-m-z拟合曲面'); shading interp; hold on; scatter3(x_scatter, y_scatter, z_scatter, 'r', 'filled'); % 可选:叠加原始散点 hold off;
小提示
shading interp可以让曲面颜色更平滑,提升可视化效果- 如果场景2的插值结果有缺失值,可以尝试更换插值方法(比如
'linear'或者'nearest')
内容的提问来源于stack exchange,提问作者acoustic python
相关产品推荐
相关产品推荐

