MATLAB使用slice函数绘制三维数据的特定切片

问题提出

        表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散空间函数值来表示取向分布函数,Data.txt是三维取向分布函数的一个实例。由于数据量非常大,不便于分析,需要借助图形来分析。请你编写一个matlab程序画出如下的几种图形来分析其取向分布特征:

        (1)用Slice函数给出其整体分布特征;

        (2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 … 90)切面上f分布情况(需要用到subplot函数);

        (3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f分布情况。

        题目要求如上,其实就是提取三维数据点阵后用slice函数,subplot和contour函数画等高线图

        本题具体代码如下:

filein = 'D:\Data.txt';
fileout = 'fileout.txt';
fidin = fopen(filein, 'r');
fidout = fopen(fileout, 'w');
while ~feof(fidin)
    tline = fgetl(fidin);
    if double(tline(1)) == double(' ')  
        fprintf(fidout, '%s\n\n', tline);
    end
end
fclose(fidin);
fclose(fidout);

% 读取数据
W = importdata('fileout.txt');

n = size(W, 2);
% 初始化一个三维数组 v
v = zeros(n,n,n);
% v 是从 W 中提取数据的三维数组
for i = 1:n
    v(:,:,i) = W((i-1)*n+1:i*n, 1:n);
end

% 准备三维网格数据
x = 0:5:90;
y = 0:5:90;
z = 0:5:90;
[x1, y1, z1] = meshgrid(x, y, z);

%使用 slice 函数绘制三维数据的特定切片
slice(x1, y1, z1, v, [45, 90], [45, 90], [0, 45]);     % 做第一题图

for i=1:19    
    subplot(5,4,i);
    contour(x,y,v(:,:,i))                              %作第二题图
end

plot(x,v(10,:,1),'o-')                                 %作第三题图
gtext('\Phi1=45','FontSize',12)
gtext('\Phi2=0','FontSize',12)

运行效果如下:

第一题图
第二题图
第三题图

代码讲解

filein = 'D:\Data.txt';         %输入文件路径
fileout = 'fileout.txt';        %输出文件路径
fidin = fopen(filein, 'r');     %打开输入文件进行读取
fidout = fopen(fileout, 'w');   %打开输出文件进行写入
while ~feof(fidin)              %读取输入文件的一行
    tline = fgetl(fidin);
    if double(tline(1)) == double(' ')      %检查第一个字符是否为空格
        fprintf(fidout, '%s\n\n', tline);    %如果是,写入输出文件,并添加两个换行符
    end
end
fclose(fidin);     %关闭输入文件
fclose(fidout);    %关闭输出文件

        第一部分代码用于处理待处理数据文件,由于文件中含有其他无关信息,需要根据特定需求筛选数据,再用文件输入替代大型矩阵输入。

        输入输出文件对比如下

         

W = importdata('fileout.txt');    %读取数据
n = size(W, 2);      %确定数据的列数
v = zeros(n,n,n);    % 初始化一个三维数组 v
                     
for i = 1:n
    v(:,:,i) = W((i-1)*n+1:i*n, 1:n);%将数据从W导入到v的特定层
end

% 生成三维网格
x = 0:5:90;
y = 0:5:90;
z = 0:5:90;
[x1, y1, z1] = meshgrid(x, y, z);

        第二部分代码将已经处理好的数据文件拆分成19部分,每部分是19*19的矩阵,对应第二题中不同φ2的取值,每个φ2的值对应一张需要画出的图片。原文件Data.txt实际上单独给出了每个φ值对应的矩阵,但被第一部分代码删除了,因此要在这里重新分离。

部分三维数组v的取值

        

Data.txt文件部分内容

         

slice(x1, y1, z1, v, [45, 90], [45, 90], [0, 45]); % 使用slice函数绘制v的特定切片

for i=1:19    
    subplot(5,4,i);        %将窗口分割成5行4列,在循环中选择当前的子图区域进行绘图
    contour(x,y,v(:,:,i))  %绘制等高线                         
end


plot(x,v(10,:,1),'o-')          %选取第十行第一列的数据作为y轴                           
gtext('\Phi1=45','FontSize',12) %用于添加文本注释
gtext('\Phi2=0','FontSize',12)

        第三部分代码用于画图,[45, 90]定义了xoy平面的旋转角度,[45, 90],[0, 45]分布定义yoz和zox平面的旋转角度,用于调整视角。slice用于绘制特定切片,contour用于绘制等高线。第十行第一列为α取向线。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值