赞
踩
#这个问题应该分两种情况讨论,即:
①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 © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。