前言
-
今天手头上拿到一份论文的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
函数用于生成网格点坐标。这里,它生成了两个矩阵x
和y
,它们的大小与z
相同。x
矩阵的每个元素表示网格点的x坐标,y
矩阵的每个元素表示网格点的y坐标。size(z,1)
和size(z,2)
分别返回矩阵z
的行数和列数。也就是30和25 -
xx=x(:);
、yy=y(:);
和zz=z(:);
将矩阵x
、y
和z
转换为列向量xx
、yy
和zz
。这是因为scatter3
函数需要输入向量的形式,而不是矩阵。
1-2 scatter3函数API
-
scatter3
函数用于在三维空间中绘制散点图。其基本语法如下:
scatter3(x, y, z)
scatter3(x, y, z, s)
scatter3(x, y, z, s, c)
scatter3(..., 'filled')
-
x
、y
、z
:这三个参数分别代表三维空间中的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)
:使用矩阵X
、Y
和Z
来绘制三维曲面图。X
和Y
定义网格点的x和y坐标,Z
定义网格点的z坐标。 -
surf(X,Y,Z,C)
:使用矩阵X
、Y
、Z
和C
来绘制三维曲面图。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
- 如有错误,欢迎指出,感谢大家的支持!