MATLAB制作散点图:从基础到进阶的三种类型讲解

一、什么是散点图

散点图是一种用来展示两个或多个变量之间关系的图表形式。它可以帮助我们直观地观察变量之间是否存在相关性、趋势或异常值,常用于数据分析的初步探索阶段。

二、三种类型散点图

1. 基本二维散点图:最简单、最常用

基本二维散点图的适用场景

当你手头只有两个连续的数字变量,比如"身高"和"体重",或者"价格"和"销量",想看它们之间有没有关系时,用这个最合适。

举个例子:

你想知道一个人身高越高,是不是体重也越重?那你就画个散点图,把"身高"当横轴,"体重"当纵轴,点一画上去,图就出来了。如果点大致排成一条斜线,那就说明:它们有关!

适用场景总结

  • 观察趋势和相关性

  • 检查是否有异常值

  • 做初步的数据探索

2. 按类别分组着色的散点图:比较不同"群体"的差异

按类别分组着色的散点图的适用场景

当你有两个数值变量(比如"身高"和"体重"),但你还知道每个人是男生还是女生,或者是来自不同城市的。你想对比不同群体在这些数值上的分布,这时候就需要分组着色的散点图。

举个例子:

你把男性的数据点涂成蓝色,女性的数据点涂成红色,一下就能看出:女生更集中在某个区域,男生在哪里分布更广,等等。

适用场景总结

  • 分类变量(性别、地区、类型)+ 两个数值变量

  • 想看不同群体的差异或分布趋势

  • 非常适合做对比分析

3. 三维散点图:一次看三个数字变量

三维散点图的适用场景

你现在不仅有"身高"和"体重",还有"年龄",想看三者之间有没有关系。这时候就可以用三维散点图。它比二维图多了一个维度,可以在空间中呈现点的"走向"。

举个例子:

你在一张 3D 图里看出:随着年龄增加,身高先升后降,体重慢慢变大------这种复杂的关系,二维图是看不出来的。

适用场景总结:

  • 同时分析三个数值变量

  • 适合探索复杂的多变量关系

  • 更适合有交互式可视化支持的场景

|-------------------|-----------------|
| 你手上有什么数据? | 用哪种散点图? |
| 两个数字(例:身高、体重) | 基本二维散点图 |
| 两个数字 + 一个分类(例:性别) | 分组着色散点图 |
| 三个数字(例:身高、体重、年龄) | 三维散点图 |
[### 三种类型散点图总结]

三、实现绘图前的数据检查

针对三种类型的散点图数据需求

|---------------|-------------------------|
| 散点图类型 | 特别准备事项 |
| 基本二维散点图 | 确保两个变量都是数值型 |
| 分组着色散点图 | 第三个变量(分类)需为字符串或分类类型 |
| 三维散点图 | 三个变量都需为连续数值型,且无缺失 |

四、MATLAB绘制相应散点图

1. 基本二维散点图绘制

只要两个数值变量,比如"身高"和"体重",用最基础的 scatter() 函数就能搞定。

以下是相关代码实现:

Matlab 复制代码
% 读取数据并保留原始列名,使得原本中文列名不被修改,以下用调取excel表格为例
data = readtable('散点图制作.xlsx', 'sheet', 'sheet1', 'VariableNamingRule', 'preserve');
x = data.('身高');
y = data.('体重');
% 创建图形窗口
figure('Color', 'w');
% 绘制较小圆点的散点图,以下数据大小可以按需更改
scatter(x, y, 40, ...  % 点大小改为40(点较小,可以按照需求更改)
    'MarkerEdgeColor', [0.3 0.5 0.7], ...% 点的边缘颜色设为蓝灰色
    'MarkerFaceColor', [0.5 0.7 0.9], ...% 点的填充颜色为淡蓝色
    'MarkerFaceAlpha', 0.6, ...% 点的透明度设置为 0.6
    'LineWidth', 0.6);  % 线条粗细
hold on
% 拟合数据后,添加趋势线(浅红虚线)
p = polyfit(x, y, 1);
yfit = polyval(p, x);
plot(x, yfit, '--', 'Color', [1 0.4 0.4], 'LineWidth', 1.5);% 颜色粗细也均可更改
% 标签和标题字体大小与类型(字体略小,可自我调整)
xlabel('身高 (cm)', 'FontSize', 11,'FontWeight', 'bold','FontName', '宋体')
ylabel('体重 (kg)', 'FontSize', 11,'FontWeight', 'bold','FontName', '宋体')
title('身高与体重的关系', 'FontSize', 13, 'FontWeight', 'bold','FontName', '宋体')
% 图例(去边框,略小字体)
legend({'数据点', '趋势线'}, 'Location', 'southeast', 'Box', 'off', 'FontSize', 10)
% 网格和坐标轴美化
grid on
box off
set(gca, 'FontSize', 10, 'LineWidth', 1, 'TickDir', 'out')

散点图实现:

2. 按类别分组着色的散点图绘制

需要有两个数值变量,比如"身高"和"体重",再加上一个分类变量(比如"性别"),就可以通过循环搭配 scatter() 函数,轻松画出按类别分组着色的散点图。不同类别的数据点用不同颜色区分,既直观又美观,适合展示各类数据在二维数值变量上的分布差异。

以下是相关代码实现:

Matlab 复制代码
% 读取数据并保留原始列名,使得原本中文列名不被修改
data = readtable('散点图制作.xlsx', 'sheet', 'sheet2', 'VariableNamingRule', 'preserve');
x = data.('身高');
y = data.('体重');
group = data.('性别');  % 分类变量提取,按照实际情况修改
% 获取唯一类别标签
groups = unique(group);
colors = lines(length(groups));  
% 创建图形窗口
figure('Color', 'w');
hold on;
% 按类别绘制散点图并添加拟合线
for i = 1:length(groups)
    idx = strcmp(group, groups{i});  % 当前类别的数据索引
    % 绘制较小圆点的散点图,以下数据大小可以按需更改
    scatter(x(idx), y(idx), 40, ...
        'MarkerEdgeColor', [0.2 0.2 0.2], ...
        'MarkerFaceColor', colors(i, :), ...
        'MarkerFaceAlpha', 0.6, ...
        'LineWidth', 0.6, ...
        'DisplayName', groups{i});  % 设置图例
    % 拟合线(每组单独)
    p = polyfit(x(idx), y(idx), 1);           
    xfit = linspace(min(x(idx)), max(x(idx)), 100);  
    yfit = polyval(p, xfit);                  
    plot(xfit, yfit, '--', ...
        'Color', colors(i, :), ...
        'LineWidth', 1.5, ...
        'DisplayName', [groups{i} ' - 拟合线']); 
end
% 坐标轴标签和标题(字体可按需修改)
xlabel('身高 (cm)', 'FontSize', 11, 'FontWeight', 'bold', 'FontName', '宋体')
ylabel('体重 (kg)', 'FontSize', 11, 'FontWeight', 'bold', 'FontName', '宋体')
title('不同性别的身高与体重关系(含趋势线)', 'FontSize', 13, 'FontWeight', 'bold', 'FontName', '宋体')
% 图例
legend('Location', 'southeast', 'Box', 'off', 'FontSize', 10)
% 网格和坐标轴美化
grid on
box off
set(gca, 'FontSize', 10, 'LineWidth', 1, 'TickDir', 'out')

散点图实现:

3. 三维散点图的绘制

需要有三个数值变量,比如"身高"、"体重"和"年龄",再加上一个分类变量(比如"性别"),就可以通过循环搭配 scatter3() 函数,轻松绘制出按类别分组着色的三维散点图。不同类别的数据点用不同颜色标识,在三维空间中直观展示出变量之间的立体分布关系,特别适合用来观察多变量之间的联合趋势与类别间的结构差异。

以下是相关代码实现:

Matlab 复制代码
% 读取数据并保留原始列名,使得原本中文列名不被修改
data = readtable('散点图制作.xlsx', 'sheet', 'sheet3', 'VariableNamingRule', 'preserve');
x = data.('身高');
y = data.('体重');
z = data.('年龄');      % 增加的第三个数值变量
group = data.('性别');  % 分类变量
% 类别和颜色
groups = unique(group);
colors = lines(length(groups));
% 图形窗口
figure('Color', 'w', 'Position', [100 100 800 600]);
hold on;
ax = gca;
ax.Color = [0.97 0.97 0.97];
ax.GridColor = [0.8 0.8 0.8];
ax.GridAlpha = 0.4;
% 绘制三维散点图,以下数据可以按需修改
for i = 1:length(groups)
    idx = strcmp(group, groups{i});
    scatter3(x(idx), y(idx), z(idx), 60, ...
        'MarkerEdgeColor', [0.3 0.3 0.3], ...
        'MarkerFaceColor', colors(i,:), ...
        'MarkerFaceAlpha', 0.7, ...
        'LineWidth', 0.7, ...
        'DisplayName', groups{i});
end
% 标签和标题字体大小与类型(字体略小,可自我调整)
xlabel('身高 (cm)', 'FontSize', 12, 'FontWeight', 'bold', 'FontName', '宋体');
ylabel('体重 (kg)', 'FontSize', 12, 'FontWeight', 'bold', 'FontName', '宋体');
zlabel('年龄 (岁)', 'FontSize', 12, 'FontWeight', 'bold', 'FontName', '宋体');
title('不同性别的身高、体重与年龄三维分布', ...
    'FontSize', 14, 'FontWeight', 'bold', 'FontName', '宋体');
legend('Location', 'northeastoutside', 'Box', 'off', 'FontSize', 10);
% 美化坐标轴
view(45, 20);
grid on;
box on;
rotate3d on;
axis tight;
set(gca, 'FontSize', 10, 'FontName', '宋体', 'LineWidth', 1, 'TickDir', 'out');
camproj perspective;

散点图实现:

通过上面的案例示范,相信大家已经了解了如何利用 MATLAB 绘制不同的散点图。可视化不仅让数据更易于理解,也为后续的数据分析和交流打下了良好基础。如果你也在处理类似的多变量数据,不妨动手试一试,让图形为你的分析加分!(如有不对的地方也可以指出哦~)

相关推荐
ghie90907 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
wuk9987 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab
2401_863318639 小时前
机动车防撞击系统设计
matlab
jllllyuz13 小时前
MATLAB实现蜻蜓优化算法
开发语言·算法·matlab
yyy(十一月限定版)14 小时前
初始matlab
开发语言·matlab
listhi52014 小时前
基于MATLAB的支持向量机(SVM)医学图像分割方法
开发语言·matlab
Heorine15 小时前
数学建模 绘图 图表 可视化(6)
python·数学建模·数据可视化
崇山峻岭之间16 小时前
Matlab学习记录30
开发语言·学习·matlab
民乐团扒谱机16 小时前
【微实验】MATLAB 仿真实战:多普勒效应 —— 洒水车音乐的音调变化仿真
开发语言·matlab·多普勒效应·多普勒频移
Evand J17 小时前
【课题推荐】基于超分辨率技术的低功耗定位系统|低功耗物联网|信号处理。附MATLAB运行结果
物联网·matlab·信号处理