• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

【Matlab】离散点绘制三维曲面方法小结

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

任务

用给定的离散点绘制三维曲面,例如给下列数据:

% x y z
1 2 3
1 5 2
2 3 4
3 8 5
...

分析

1.数据不是等间隔的格网数据

在这种情况下无法直接使用meshsurf等函数,因为这些函数要求的数据格式为格网形式,每个点是等间隔的,就像这样:

实际情况确不是这样(实际无规则,可以在后面的图中看到),所以需要插值生成格网数据。

2.生成格网数据

既然原始数据不规则,那么就想办法让它规则,举个例子,原始数据是这样的:

格网化的目的就是使网格节点上有数据(插值生成的蓝色点,不对边界进行插值,画图的时候红色的点就不要了):

实战

大概查看

可以先用plot3scatter看看离散的点:

% 清理命令和变量,以免内存不够
clc;clear;

% 读数据
% 数据格式:x,y,z
data = load(\'hv_re.txt\');
x1 = data(:, 1);
y1 = data(:, 2);
z1 = data(:, 3);

% 抽稀,以免内存不够
count    = 1;     % 新变量计数器
interval = 10000; % 抽稀间隔
for i = 1 : interval : length(x1)
    x(count, 1) = x1(i, 1);
    y(count, 1) = y1(i, 1);
    z(count, 1) = z1(i, 1);
    count = count + 1;
end

% plot3
figure;
plot3(x, y, z, \'*\');
view(0, 90); % 视角,从上往下看

% 散点图
figure;
scatter(x, y, 25, z, \'filled\'); % 散点大小可调
colorbar;

plot3:

scatter:

插值绘图

原始数据为三列,分别为x,y,z。要想画三维曲面图就需要matlab认识的格网数据。所以,要先进行插值。先用meshgrid结合minmax函数产生网格坐标(这样就是原来的x,y从最小值到最大值均匀间隔的点),再用griddata函数对这些点上的Z值进行插值(因为这些点上不一定有数据,需要插值得到),最后用surf画图(mesh、pcolor也可以)。参考 : Matlab 之meshgrid, interp, griddata 用法和实例(转)

% 清理命令和变量,以免内存不够
clc;clear;

% 读数据
% 数据格式:x,y,z
data = load(\'hv_re.txt\');
x1 = data(:, 1);
y1 = data(:, 2);
z1 = data(:, 3);

% 抽稀,以免内存不够
count    = 1;     % 新变量计数器
interval = 1000; % 抽稀间隔
for i = 1 : interval : length(x1)
    x(count, 1) = x1(i, 1);
    y(count, 1) = y1(i, 1);
    z(count, 1) = z1(i, 1);
    count = count + 1;
end

%确定网格坐标(x和y方向的步长均取0.1)
[X,Y]=meshgrid(min(x):0.1:max(x),min(y):0.1:max(y)); 
%在网格点位置插值求Z,注意:不同的插值方法得到的曲线光滑度不同
Z=griddata(x,y,z,X,Y,\'v4\');
%绘制曲面
figure(1)
surf(X,Y,Z);
shading interp;
colormap(jet);
% view(0, 90);
colorbar;
print(gcf, \'-djpeg\', \'xyz.jpg\'); % save picture

结果:

3d:

flat:

小结

1.格网化的目的:产生规则化的数据,matlab才能识别、作图。所以问题是:matlab有没有这样的函数:直接读取不规则的数据,自动生成网格数据、作图,而不需要用户来做这些事?我没有找到。。。

2.用plot3scatter可以看离散的点。

3.插值绘图:meshgrid:生成格网,griddata:插值,surf:绘图。

4.色标的问题:由于数据中存在一些有问题的点,比如特别大和特别小,图本来应该是有起伏变化的,就是因为这些点,整个图看上去非常平坦,所以有两种做法:

1)改色标。随手百度了一个可以在图画出来以后改,参考:matlab如何自定义colorbar。至于如何用代码或者cpt文件之类的方法还没有去搜过。

2)去除有问题的点。

2017/8/27注

进一步参考:matlab插值小记,对插值有一个更好的理解。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
DELPHI+ClientDataSet+DBGRIDEH进行排序发布时间:2022-07-18
下一篇:
Delphi初浅入门笔记之十:多媒体编程三(打开图片篇)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap