任务
使用指定的离散点绘制三维曲面,例如:
% x y z
1 2 3
1 5 2
2 3 4
3 8 5
.
分析
1 .数据不是等间隔的网格数据
在这种情况下,不能直接使用mesh、surf等函数。 这些函数所需的数据格式是网格格式,因为每个点都是等间隔的。
因为实际上不是(实际上没有规则,可以在以后的图中看到),所以有必要对网格数据进行插值来生成。
2 .生成网格数据
既然原始数据不规则,就考虑一下使其规则化的方法吧。 举个例子,原始数据如下。
网格化的目的是使网格节点具有数据(插值生成的蓝点不插值边界,绘制时不需要红点)。
实战
粗略地看
首先,让我们用plot3和scatter来看看离散点:
清除命令和变量,以避免%内存不足
clc; 清除器
%读取数据
%数据格式: x、y、z
data=load(HV_re.txt );
x1=data (:1 );
y1=data (:2 );
Z1=data (:3 );
请稀释到%内存不足
计数=1; %新建变量计数器
间隔=10000; %剔除间隔
Fori=1:间隔:长度(x1 ) )。
x (计数,1 )=x1 ) I,1 );
y (计数,1 )=y1 ) I,1 );
z(count,1 )=Z1 ) I,1 );
count=count 1;
结束
% plot3
图形;
plot3(x、y、z、' * ' );
视图(0,90 ); %视角,自上而下
%散布图
图形;
scatter(x,y,25,z,' filled ' ); %散点尺寸可调整
colorbar;
plot3:
scatter:
插值绘图
原始数据为3列,分别为x、y、z。 绘制三维曲面图需要matlab识别的网格数据。 所以,首先进行插值。 首先,用meshgrid合并min、max函数生成网格坐标(这是原始x、y从最小值到最大值等间隔的点),然后用griddata函数插值这些点处的z值(因为这些点不一定有数据,所以进行插值参考: Matlab中的meshgrid、interp和griddata的用法和实例(旋转) ) ) ) ) ) ) ) ) ) ) )。
清除命令和变量,以避免%内存不足
clc; 清除器
%读取数据
%数据格式: x、y、z
data=load(HV_re.txt );
x1=data (:1 );
y1=data (:2 );
Z1=data (:3 );
请稀释到%内存不足
计数=1; %新建变量计数器
间隔=1000; %剔除间隔
Fori=1:间隔:长度(x1 ) )。
x (计数,1 )=x1 ) I,1 );
y (计数,1 )=y1 ) I,1 );
z(count,1 )=Z1 ) I,1 );
count=count 1;
结束
确定%网格坐标(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;
颜色映射(jet );
% view (0,90 );
colorbar;
print(GCF,'-djpeg ',' xyz.jpg '; % save picture
结果:
3d:
flat:
总结
1 .网格化目的:产生有序化数据,matlab可以识别、制图。 因此,问题是matlab是否具有直接读取不规则数据,使用户无需执行这些操作即可自动生成或绘制栅格数据的函数。 我没找到。
在plot3和scatter中可以看到离散的点。
3 .插值绘图: meshgrid :生成网格;griddata :插值;surf :绘图。
4 .色标问题:数据有问题。 例如,有特别大的一点和小的一点。 图本来应该是起伏的,但是由于这些点,整个图看起来非常平坦,所以有两种做法。
1 )更改色标。 百度在画出来后就可以改变了。 参考: matlab如何自定义颜色栏? 我从没怎么用代码或cpt文件等方法搜索过。
2 )消除问题。