如何将EXCEL里面的大量数据导入MATLAB并且作出三维曲面图

您所在的位置:网站首页 利用excel表生成曲线图 如何将EXCEL里面的大量数据导入MATLAB并且作出三维曲面图

如何将EXCEL里面的大量数据导入MATLAB并且作出三维曲面图

2023-07-23 04:17| 来源: 网络整理| 查看: 265

#这个问题应该分两种情况讨论,即:

①EXCEL表格文件中不包含X轴和Y轴的数据,它里面的值实质上表示它在三维曲面上Z的值,而它的坐标(行,列)表示它在三维曲面上X、Y的坐标。如下图:

②EXCEL表格文件中包含三组数据,即包含三个维度的取值。点在三维曲面上X轴的取值,Y轴的取值,Z轴的取值,这个最容易理解,也最容易处理。如下图:

 ##############################手动分割线##############################

#首先我们先来讨论第一种情况,即EXCEL表格文件中不包含X轴和Y轴的数据。

#那么我们面临如下的几个问题:

##①MATLAB如何读取EXCEL表格中的数据

##②这些数据在MATLAB中是以一个矩阵的形式存在,那么如何用一个矩阵画出三维曲面图

##③已知一个矩阵,分别以行、列数为X,Y轴的坐标,矩阵元素做Z轴坐标,做一个三维的图像,该如何去实现?

#话不多说,直接上代码吧。

clear;%清除工作空间中的所有变量 clc;%清除命令窗口中的所有代码 [num]=xlsread('E:\date02.csv')%xlsread()函数 %-----------------------手动分割线------------------------------% %xlsread()函数的讲解: %书写语法结构 % [num,txt,raw]=xlsread('C:\Users\Administrator\Desktop\test\a.xls') %其中num返回的是excel中的数据, %其中txt输出的是文本内容, %而raw输出的是未处理数据 %For example(例如): %有一个这样的表格 % A B C D E % 1 一 二 三 四 五 % 2 11 22 33 44 55 % 3 66 77 88 99 00 % 4 55 44 33 22 77 % %那么输出[num]\[txt]\[raw]的结果分别是: % num= % 11 22 33 44 55 % 66 77 88 99 00 % 55 44 33 22 77 % % txt= % '一' '二' '三' '四' '五' % % raw= % '一' '二' '三' '四' '五' % 11 22 33 44 55 % 66 77 88 99 00 % 55 44 33 22 77 % %一般情况下,我们读取的是excel中的数据,所以可以直接用[num],只输出数据矩阵便可。 % %那么如何读取指定sheet中的数据呢? %如果想读取excel中的第二个sheet中的数据,可以输入下面命令 %[num]=xlsread('C:\Users\Administrator\Desktop\test\a.xls',2) %当然默认情况下是读取第一个sheet中的数据,也就是参数默认为1 % %那么如何读取指定单元格中的数据呢? %[num]=xlsread('C:\Users\Administrator\Desktop\test\a.xls',2,'A2:C5') %其中A2:C5就代表了读取A2到C5这一个矩形框区域内的数据 %A:C就代表了读取A到C这三列的数据 %2:4就代表了读取2到4这三行的数据 %-------------------------手动分割线------------------------------% z=[num]%把矩阵[num]的值赋给z [x y]=meshgrid(1:size(z,1),1:size(z,2));%根据序号生成x,y矩阵 %meshgrid()函数就是用来生成两个矩阵的函数 %-----------------------手动分割线------------------------------% %meshgrid是MATLAB中用于生成网格采样点的函数。 %在使用MATLAB进行3-D图形绘制方面有着广泛的应用。 % % meshgrid就是把各个点的x坐标独立出来, %把这个独立出来的x坐标放到一个矩阵当中,设为X~~ %然后再把各个点的y坐标也独立出来, %把这个独立出来的y坐标也放到一个矩阵当中,设为Y~~ %这样对应的x、y结合,便表示了上面的坐标 矩阵。 % %上面的描述,我们可以知道,meshgrid返回的两个矩阵X、Y必定是行数、列数相等的 %(即X、Y两个矩阵都有相同的行数,和相同的列数) % %[X,Y] = meshgrid(x,y) // 这个语句是用的最多的语句 %而我们今天用的这句[x y]=meshgrid(1:size(z,1),1:size(z,2)); %记住就好了,目前我也看不懂啥意思,就是根据序号生成x,y矩阵 %-----------------------手动分割线------------------------------% xx=x(:);%将矩阵转换为向量 yy=y(:);%因为后面的scatter3函数中xx,yy,zz要为长度相同的向量 zz=z(:);%注意:一是要长度相同,二就是必须是向量 scatter3(xx,yy,zz,'b'); %根据三个向量,也就是一些坐标点作出散点图 %-----------------------手动分割线------------------------------% %##scatter3()函数 %###但是讲scatter3()函数之前我想先讲scatter()函数 %####scatter()函数 % scatter函数基本用法 % scatter(x,y) % scatter(x,y,sz) % scatter(x,y,sz,c) % scatter(___,'filled') % scatter(___,mkr) % scatter(___,Name,Value) % scatter(ax,___) % scatter(x,y) 在向量 x 和 y 指定的位置创建一个包含圆形的散点图。 % 该类型的图形也称为气泡图。 % scatter(x,y,sz) 指定圆大小。要绘制大小相等的圆圈,请将 sz 指定为标量。 % 要绘制大小不等的圆,请将 sz 指定为长度等于 x 和 y 的长度的向量。 % scatter(x,y,sz,c) 指定圆颜色。要以相同的颜色绘制所有圆圈, % 请将 c 指定为颜色名称或 RGB 三元组。 % 要使用不同的颜色,请将 c 指定为向量或由 RGB 三元组组成的三列矩阵。 % scatter(___,'filled') 填充圆形。可以将 'filled' 选项与前面语法中的任何输入参数组合一起使用。 % scatter(___,mkr) 指定标记类型。 % scatter(___,Name,Value) 使用一个或多个名称-值对组参数修改散点图。 % 例如,'LineWidth',2 将标记轮廓宽度设置为 2 磅。 % scatter(ax,___) 将在 ax 指定的坐标区中,而不是在当前坐标区中绘制图形。 % 选项 ax 可以位于前面的语法中的任何输入参数组合之前。 % s = scatter(___) 返回 Scatter 对象。在创建散点图后,以后可使用 s 对其进行修改。 %###scatter3函数和scatter函数用法一模一样,只是多加了一个维度而已。 %scatter3()函数用法 % scatter3(X,Y,Z) % scatter3(X,Y,Z,S) % scatter3(X,Y,Z,S,C) % scatter3(___,'filled') % scatter3(___,markertype) % scatter3(___,Name,Value) % scatter3(ax,___) % h = scatter3(___) % scatter3(X,Y,Z) 在向量 X、Y 和 Z 指定的位置显示圆圈。 % scatter3(X,Y,Z,S) 使用 S 指定的大小绘制每个圆圈。要绘制大小相等的圆圈,请将 S 指定为标量。 % 要绘制具有特定大小的每个圆,请将 S 指定为向量。 % scatter3(X,Y,Z,S,C) 使用 C 指定的颜色绘制每个圆圈。如果 C 是 RGB 三元组, % 或者是包含颜色名称的字符向量或字符串,则使用指定的颜色绘制所有圆圈。 % 如果 C 是一个三列矩阵,其中 C 中的行数等于 X、Y 和 Z 的长度, % 则 C 的每行指定相应圆圈的 RGB 颜色值。 % 如果 C 是长度与 X、Y 和 Z 的长度相同的向量,则 C 中的值线性映射到当前颜色图中的颜色。 % scatter3(___,'filled') 使用前面的语法中的任何输入参数组合填充这些圆。 % scatter3(___,markertype) 指定标记类型。 % scatter3(___,Name,Value) 使用一个或多个名称-值对组参数修改散点图。 % scatter3(ax,___) 将图形绘制到 ax 指定的坐标区中,而不是当前坐标区 (gca) 中。 % 选项 ax 可以位于前面的语法中的任何输入参数组合之前。 % h = scatter3(___) 返回 Scatter 对象。在创建散点图后,可使用 h 修改其属性。 % %-----------------------手动分割线------------------------------% %注意其中的k是MATLAB中形状颜色的一种 %% Matlab的plot的线形、marker的形状、颜色 %% - Solid line (default) %% -- Dashed line %% : Dotted line %% -. Dash-dot line %% %% Marker Description %% o Circle %% + Plus sign %% * Asterisk %% . Point %% x Cross %% s Square %% d Diamond %% ^ Upward-pointing triangle %% v Downward-pointing triangle %% > Right-pointing triangle %% < Left-pointing triangle %% p Pentagram %% h Hexagram %% %% Color Description %% y yellow %% m magenta %% c cyan %% r red %% g green %% b blue %% w white %% k black %-----------------------手动分割线------------------------------% %[X,Y,Z]=griddata(xx,yy,zz,linspace(min(xx),max(xx))',linspace(min(yy),max(yy)),'nearest'); %邻近点插值 %[X,Y,Z]=griddata(xx,yy,zz,linspace(min(xx),max(xx))',linspace(min(yy),max(yy)),'linear'); %线性插值 %[X,Y,Z]=griddata(xx,yy,zz,linspace(min(xx),max(xx))',linspace(min(yy),max(yy)),'cubic'); %三次插值 [X,Y,Z]=griddata(xx,yy,zz,linspace(min(xx),max(xx))',linspace(min(yy),max(yy)),'v4'); %格点样条函数插值 %-----------------------手动分割线------------------------------% %##griddata()函数 % matlab中的插值函数 griddata函数 % [X,Y,Z]=griddata(x,y,z,linspace(min(x),(max(x),m)',linspace(min(y),(max(y),n),'v4') % 其中m,n代表分割数目,如果数据量太大,分隔数目就要取得大一点,否则很卡 % % griddata 调用方法: % ZI = griddata(x,y,z,XI,YI) % [XI,YI,ZI] = griddata(x,y,z,XI,YI) % [...] = griddata(...,method) % [...] = griddata(...,method,options) % method 的值 为 % 'linear' -- 即,以三角形为基础的线性内插 % 'cubic' -- 即,以三角形为基础的三次方程内插 % 'nearest' -- 即,用最邻近的点 内插 % 'v4'-- -- -- 即,MATLAB 4 格点样条函数内插 % 默认'linear' 线性内插 % 三角形为基础,就是按Delaunay方法先找出内插点四周的3个点,构成三角形,内插点在三角形内。 % 然后线性内插,或三次方程内插. % 'cubic' 和 'v4' 插值结果构成的曲面较光滑,'linear'和 'nearest' 插值结果 % 构成的曲面不光滑不连续。 % %-----------------------手动分割线------------------------------% pcolor(X,Y,Z);shading interp%伪彩色图 figure,contourf(X,Y,Z) %等高线图 figure,surf(X,Y,Z);%三维曲面 figure,meshc(X,Y,Z)%剖面图 view(0,0); figure,meshc(X,Y,Z);%s三维曲面(浅色)+等高线 hidden off;

 #当然在我们把EXCEL表格中的数据提取到MATLAB中,放入到矩阵中后,我们还有另外一种作三维曲面的方法。代码如下(这段代码中的函数详细讲解,下次再讲了,码累了,〒▽〒):

clear; clc; [num]=xlsread('E:\date02.csv') z=[num] subplot(1,2,1) x=0:1:15; y0=0:1:23; y=y0'; surf(x,y,z); subplot(1,2,2) x1=0:0.1:15; y01=0:0.1:23; y1=y01'; z1=interp2(x,y,z,x1,y1,'spline'); surf(x1,y1,z1)

最后出来的效果图如下:

图 一

图 二

 图三

##############################手动分割线##############################

第二种情况我下一次分享再讲吧



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3