【Matlab绘图】从Excel导入表格并进行三维绘图

时间:2024-10-04 14:51:41

前言

  • 今天手头上拿到一份论文的xlsx数据,要求使用MATLAB绘制进行三维图标坐标绘制。那么我们来看看如何使用如下数据进行绘图。请添加图片描述

  • 如上数据所示,数据是一个30行25列的数据,数据的内容是论文某项模型模拟的结果,我们希望把横坐标x取值30行,纵坐标y取值20列,而其横纵坐标对应的表格数值设置为z。


1 三维散点图scatter3

1-1 代码解释
  • 我们直接看代码
clc;
clear all;
filename = 'data.xlsx'; 
T = readtable(filename);
dataMatrix = table2array(T);

z=[dataMatrix];
[x, y]=meshgrid(1:size(z,1),1:size(z,2));
xx=x(:); 
yy=y(:); 
zz=z(:); 
scatter3(xx,yy,zz,'filled');
  • clc;clear all;
    • clc; 命令用于清除MATLAB命令窗口中的所有输出,以便开始一个干净的新会话。
    • clear all; 命令用于清除工作空间中的所有变量,释放内存。
  • dataMatrix = table2array(T);:将表格 T 转换为矩阵 dataMatrix
  • [x, y] = meshgrid(1:size(z,1),1:size(z,2));meshgrid 函数用于生成网格点坐标。这里,它生成了两个矩阵 xy,它们的大小与 z 相同。x 矩阵的每个元素表示网格点的x坐标,y 矩阵的每个元素表示网格点的y坐标。size(z,1)size(z,2) 分别返回矩阵 z 的行数和列数。也就是30和25
  • xx=x(:);yy=y(:);zz=z(:);将矩阵 xyz 转换为列向量 xxyyzz。这是因为 scatter3 函数需要输入向量的形式,而不是矩阵。
1-2 scatter3函数API
  • scatter3函数用于在三维空间中绘制散点图。其基本语法如下:
scatter3(x, y, z)
scatter3(x, y, z, s)
scatter3(x, y, z, s, c)
scatter3(..., 'filled')
  • xyz:这三个参数分别代表三维空间中的x、y、z坐标。
  • s:可选参数,用于设置每个散点的大小。默认值为36平方点。
  • c:可选参数,用于设置每个散点的颜色。可以是一个颜色值或颜色映射。
  • 'filled':可选参数,用于填充散点。
1-3 效果展示
  • 请添加图片描述

  • 值得注意的是如果使用的是MATLAB 2013a 版本之前的版本,readtable 函数是不可用的,需要替换为底下的xlsread

[dataMatrix, txt, raw] = xlsread(filename); 

2 三维表面图 surf

2-1 代码实现
  • 先看代码
clc;
clear all;
filename = 'data.xlsx'; 
[dataMatrix, txt, raw] = xlsread(filename); % 生成网格
[x, y] = meshgrid(1:size(dataMatrix, 2), 1:size(dataMatrix, 1)); % 生成网格,注意行列的顺序% 创建三维表面图,使用 'scatter' 形式来近似散点图
surf(x, y, dataMatrix, 'EdgeColor', 'none', 'Marker', 'o', 'MarkerSize', 5);
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Data Value');
title('3D Surface Plot with Scatter Points');
view(60, 45); 
  • view(60, 45); 是调整视角,这个函数允许用户设置视角的仰角(elevation angle)和方位角(azimuth angle)。
    • 仰角(elevation angle):这是从 x 轴正方向开始测量的角度,范围通常是从 -90° 到 90°。0° 表示从正面看,90° 表示从顶部看,-90° 表示从底部看。
    • 方位角(azimuth angle):这是从正 y 轴开始测量的角度,范围通常是从 0° 到 360°。0° 或 360° 表示从正方向看,90° 表示从左侧看,180° 表示从背面看,270° 表示从右侧看。
2-2 surf函数API
  • MATLAB中的surf函数用于创建三维曲面图。以下是surf函数的详细API:
surf(X,Y,Z)
surf(X,Y,Z,C)
surf(Z)
surf(...,PropertyName,PropertyValue,...)
h = surf(...)
  • surf(X,Y,Z):使用矩阵XYZ来绘制三维曲面图。XY定义网格点的x和y坐标,Z定义网格点的z坐标。
  • surf(X,Y,Z,C):使用矩阵XYZC来绘制三维曲面图。C用于指定颜色数据,如果未提供,则使用与Z相同的数据。
  • surf(Z):当Z是一个矩阵时,surf函数会自动生成网格线,并使用Z的列数和行数作为x和y坐标。
  • surf(...,PropertyName,PropertyValue,...):允许您使用名称-值对参数来设置曲面图的属性。例如,您可以使用'EdgeColor'属性来设置边缘颜色。
  • h = surf(...):返回曲面图的句柄,以便您可以对其进行进一步的修改。
2-3 效果展示
  • 2012版本请添加图片描述

  • 新版---------------------------------------请添加图片描述


3 三维折线图plot3

3-1 问题描述
  • 直接使用plot3对画图操作,会出现一些问题
clc;
clear all;
filename='data.xlsx'
[dataMatrix, txt, raw] = xlsread(filename); 
z=[dataMatrix]
[x, y] = meshgrid(1:size(dataMatrix, 2), 1:size(dataMatrix, 1));
xx = x(:);
yy = y(:);
zz = z(:); 
plot3(xx, yy, zz);

grid on; 
  • 由于是连续画点连线,导致每换到下一列的时候上一列结尾的数据和下一列的开头连在一起了,这是我们不希望的。请添加图片描述
3-2 修正代码
  • 我们使用循环一次只画一列数据,最后一次换列画图,得到正确的图像
clc;
clear all;
filename='data.xlsx'
[dataMatrix, txt, raw] = xlsread(filename); 

for col = 1:25
% 提取当前列的数据
z = dataMatrix(1:30, col);
% 创建网格
[x, y] = meshgrid(1:30,col);
xx = x(:); 
yy = y(:); 
zz = z(:);
% 绘制当前列的数据
plot3(xx, yy, zz); 
xlabel('X 坐标');
ylabel('Y 坐标');
zlabel('Z 值');
grid on; 
hold on; % 保持当前图形,以便在同一图形上绘制下一个列的数据

pause(0.5);
end
3-3 效果展示
  • 2012版本请添加图片描述

  • 新版----------------------------------------请添加图片描述


4 总结

  • 本文介绍了三种绘制MATLAB三维点图的方法,三维散点图scatter3,三维表面图surf, 三维折线图plot3
  • 如有错误,欢迎指出,感谢大家的支持!
    请添加图片描述