首页 > 编程笔记 > MATLAB笔记 阅读:8

MATLAB swarmchart():绘制分簇散点图(附带实例)

分簇散点图通常用于展示多个群集(Clusters)中数据点的分布情况,每个群集代表数据的一个子集或类别。分簇散点图通过在坐标系中的不同区域显示这些群集,帮助观察者理解数据的结构和群集之间的关系。

在分簇散点图中,我们对点进行了抖动处理。抖动是通过在每个点的位置上添加均匀随机值来实现的。这些随机值的调整考虑了 y 值的高斯核密度估计结果,以及每个 x 位置处的相对点数(该位置附近点的密度)。

具体来说,高斯核密度估计值用于反映 y 值的分布密度,而相对点数则用于调整每个 x 位置处的抖动程度。分簇散点图有助于可视化离散的 x 数据及 y 数据的分布。在 x 中的每个位置,点根据 y 的核密度估计值发生抖动。

在 MATLAB 中,利用函数 swarmchart() 可以创建分簇散点图,其调用格式如下。
1) 针对向量和矩阵数据:
swarmchart(x,y)    % 显示分簇散点图,点在 x 维度中偏移(抖动),形成不同的形状
                   % 每个形状的轮廓类似于小提琴。将 x、y 指定为等长向量,可以绘制一组点
                   % 将 x、y 之一指定为矩阵,可以在同一组坐标区上绘制多组点
swarmchart(x,y,sz) % 指定标记大小。将 sz 指定为标量,则以相同的大小绘制所有标记
                   % 将 sz 指定为向量或矩阵,则绘制不同大小的标记
swarmchart(x,y,sz,c) % 指定标记的颜色
swarmchart(__,mkr)   % 指定不同于默认标记(圆形)的标记
swarmchart(__,'filled') % 填充标记
swarmchart(x,y,'LineWidth',2) % 创建具有两点标记轮廓的分簇散点图
2) 针对表数据:
swarmchart(tbl,xvar,yvar) % 绘制表 tbl 中的变量 xvar 和 yvar
                          % 要绘制一个数据集,请为 xvar、yvar 分别指定一个变量
                          % 要绘制多个数据集,请为 xvar、yvar 或两者指定多个变量
swarmchart(tbl,xvar,yvar,'filled') % 绘制指定的变量并填充标记
swarmchart(tbl,'MyX','MyY','ColorVariable','MyColors') % 根据表中的数据创建分簇散点图,并使用表中的数据自定义标记颜色

【实例 1】针对向量和矩阵数据创建分簇散点图。在编辑器中编写以下程序并运行:
subplot(1,2,1)
x = [ones(1,250) 2*ones(1,250) 3*ones(1,250)];
% 创建 x 坐标组成的向量
y = [2*randn(1,250) 3*randn(1,250)+5 5*randn(1,250)+5]; % 随机值
swarmchart(x,y)           % 创建关于 x 和 y 的分簇散点图

subplot(1,2,2)
%% 创建三组 x 和 y 坐标,使用 randn 函数为 y 生成随机值
x1 = ones(1,500);
x2 = 2*ones(1,500);
x3 = 3*ones(1,500);
y1 = 2*randn(1,500);
y2 = [randn(1,250) randn(1,250)+4];
y3 = 5*randn(1,500)+5;

swarmchart(x1,y1,5)       % 第 1 个数据集,标记大小 5
hold on
swarmchart(x2,y2,5)       % 第 2 个数据集
swarmchart(x3,y3,5)       % 第 3 个数据集
hold off
运行程序后,输出如下图所示图形:


图 1 分簇散点图(1)

【实例 2】根据 BicycleCounts.csv 数据集绘制分簇散点图(表数据)。此数据集包含一段时间内的自行车交通流量数据。

在编辑器中编写以下程序并运行:
tbl = readtable(fullfile(matlabroot,'examples','matlab','data','BicycleCounts.csv'));
% 将数据集读入名为 tbl 的时间表中
tbl(1:5,:)                 % 显示表的前五行,输出略

daynames = ["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" ...
            "Friday" "Saturday"];            % 向量包含每个观测值的星期几信息
x = categorical(tbl.Day, daynames);
y = tbl.Total;               % 向量 y 包含观测到的自行车流量信息
c = hour(tbl.Timestamp);     % 向量 c 包含一天中的小时信息

swarmchart(x,y,'.');         % 指定点标记的分簇散点图,显示一周中每天的交通流量分布情况
运行程序后,输出如下图所示图形:


图 2 分簇散点图(2)

继续在编辑器中编写以下程序并运行:
s = swarmchart(x,y,10,c,'filled');     % 将标记大小指定为 10,颜色指定为向量 c
                                       % 用向量 c 中的值对图窗的颜色图进行索引操作,颜色根据每个数据点的小时信息而变化
运行程序后,输出如下图所示图形:


图 3 更改抖动类型的分簇散点图

继续在编辑器中编写以下程序并运行:
%% 在每个 x 位置更改簇的形状,使点均匀随机分布,将间距限制为不超过 0.5 个数据单位
s.XJitter = 'rand';
s.XJitterWidth = 0.5;
运行程序后,输出如下图所示图形:


图 4 更改抖动宽度的分簇散点图

相关文章