第六章 样本相似性可视化课堂练习
1 案例数据
1.1 iris:鸢尾花数据集
- R语言内置的
iris数据集(鸢尾花数据集)是统计学和机器学习领域最经典的案例数据集之一,由英国统计学家 Ronald Fisher 在1936年首次提出。它包含了3种鸢尾花的测量数据,每个类别有50个样本,共150行数据。
| 变量名 | 数据类型 | 单位 | 说明 |
|---|---|---|---|
| Sepal.Length | numeric | cm | 花萼(萼片)长度,即花朵最外层绿色叶状结构的长度 |
| Sepal.Width | numeric | cm | 花萼(萼片)宽度 |
| Petal.Length | numeric | cm | 花瓣长度,即花朵内部彩色叶状结构的长度 |
| Petal.Width | numeric | cm | 花瓣宽度 |
| Species | factor | - | 鸢尾花种类(分类标签),包含3个水平: • setosa山鸢尾• versicolor变色鸢尾• virginica维吉尼亚鸢尾 |
setosa类的花通常较小,花瓣短而宽,与其他两类差异明显;versicolor和virginica在部分特征上有重叠,分类难度更高。
2 平行坐标图和雷达图
2.1 平行坐标图
ggplot(group=id)+geom_line+geom_point绘图Species映射为颜色
2.1.1 图形观察和代码编写的心得体会
图形观察
折线图展示鸢尾花四个特征(Sepal/Petal Length/Width)在150个样本中的分布,三种花色清晰区分。
setosa花瓣特征明显偏小,virginica偏大。
折线+散点组合呈现个体特征组合模式,样本多时略拥挤。
代码心得
pivot_longer()转长表,fct_inorder()保顺序。
折线alpha=0.7防重叠,散点fill=“white”提对比度。
str_wrap()自动换行长标签。
2.2 雷达图
- 采用
ggiraphExtra::ggRadar绘图
2.2.1 图形观察和代码编写的心得体会
图形观察
雷达图清晰展示了三种鸢尾花(setosa/versicolor/virginica)在四个特征(Sepal/Petal Length/Width)上的差异。
setosa:花瓣特征(Petal)显著小于其他两类,花萼(Sepal)较宽。
virginica:花瓣特征最大,花萼长度突出。
由于 rescale=FALSE,图形保留原始数值范围(0-8),能直观对比绝对数值差异(如 Sepal.Length 普遍大于其他特征)。
代码编写心得
rescale=FALSE + ylim=c(0,8):适合强调原始数值差异,避免归一化造成的比例失真。
alpha=0.3:透明度平衡了多类别重叠时的可读性。
mytheme 集中管理样式(图例位置、坐标轴标签),提升代码复用性。
直接使用 xlab()/ylab() 快速修改轴标签,避免冗长的 theme() 嵌套。
3 星图和脸谱图
3.1 星图
采用
stars函数,对标准化数据绘制圆弧星图需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名;设置图例在合适位置,能完整显示;将图形分为10行。
3.1.1 图形观察和代码编写的心得体会
图形观察
星形图(雷达图变体)展示了鸢尾花三个物种(setosa/versicolor/virginica)在四个特征(Sepal/Petal Length/Width)上的分布。
setosa:花瓣特征(Petal)明显更小,形成紧凑的星形。
virginica:花瓣特征显著更大,星形向外扩展。
draw.segments=TRUE 用扇形区块替代折线,增强视觉对比。
代码编写心得
select(-Species) %>% as.matrix() 提取数值特征并转为矩阵,rownames 关联物种标签。
scale=TRUE:归一化是星形图的常见操作,避免特征尺度差异。
draw.segments=TRUE:用扇形替代折线,适合多样本对比。
mar 压缩图形边距,最大化绘图区域。
3.2 脸谱图
- 采用
aplpack::faces函数,作Species三个类别的脸谱图 - 需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名; - 设置图例在合适位置,能完整显示;将图形分为12列。
effect of variables:
modified item Var
"height of face " "Sepal.Length"
"width of face " "Sepal.Width"
"structure of face" "Petal.Length"
"height of mouth " "Petal.Width"
"width of mouth " "Sepal.Length"
"smiling " "Sepal.Width"
"height of eyes " "Petal.Length"
"width of eyes " "Petal.Width"
"height of hair " "Sepal.Length"
"width of hair " "Sepal.Width"
"style of hair " "Petal.Length"
"height of nose " "Petal.Width"
"width of nose " "Sepal.Length"
"width of ear " "Sepal.Width"
"height of ear " "Petal.Length"
3.2.1 图形观察和代码编写的心得体会
图形观察:
脸谱图直观呈现三物种特征差异
setosa脸型紧凑,virginica舒展
标准化处理使对比更公平
代码心得:
使用管道|>提升可读性
across()批量计算提高效率
核心参数保持简洁:
face.type控制风格
ncol.plot调整布局
scale=TRUE确保可比性
4 聚类图和热图
4.1 系统聚类树状图
- 采用
factoextra::fviz_dend函数,对标准化后数据作图; - 需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名; - 要求分为3类,观察分类结果和
Species的差异;树状图的外观为圆形。
4.1.1 图形观察和代码编写的心得体会
图形观察
层次聚类树状图清晰展示样本分组情况,3个主要分支对应鸢尾花的3个物种
同类样本距离较近,不同类间距明显
圆形布局(type=“circular”)增强空间利用率
彩色矩形框(rect=TRUE)突出显示不同聚类
颜色区分度高(Set1调色板)
代码编写心得
矩阵转换+标准化(scale)确保距离计算公平
行名设置保留原始分类信息
欧式距离+ward.D2法适合连续变量聚类
k=3准确匹配真实物种数量
fviz_dend参数丰富,可灵活调整:
cex控制标签可读性
lwd影响分支线条粗细
调色板增强视觉效果
4.2 K-menas聚类主成分图
采用
factoextra::fviz_cluster函数,对标准化后数据作图;需要先将四个数值变量转化为矩阵,并将
1:150作为矩阵的行名;要求分为3类,类别轮廓为正态分布,观察哪些观察值比较异常。
4.2.1 图形观察和代码编写的心得体会
图形观察
聚类分布
K-means将150个样本分为3类,与鸢尾花真实物种基本对应
聚类中心点位置合理,边界清晰
置信椭圆(ellipse.type=“norm”)展示各类分布范围
可视化效果
标签防重叠(repel=TRUE)保证可读性
点大小(pointsize=2)和标签大小(labelsize=9)比例协调
代码编写心得
数据预处理
矩阵转换+标准化(scale())确保特征同等权重
行名设置(1:150)便于样本追踪
聚类分析
centers=3匹配真实物种数
默认使用欧式距离,适合连续变量
可视化优化
fviz_cluster自动处理降维展示(PCA)
repel=TRUE智能调整标签位置
ellipse.type增强统计解释性
4.3 热图
采用
gplots::heatmap.2函数,对原始数据绘制热力图需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名;要求横轴和纵轴均添加聚类树状图
4.3.1 图形观察和代码编写的心得体会
图形观察
热图模式
行(样本)和列(特征)的双向聚类展示数据分布规律
setosa样本在Petal特征上明显区分
颜色梯度(rainbow)清晰反映数值大小
聚类结构
树状图显示样本和特征的层次关系
setosa分支独立,versicolor和virginica部分重叠
可视化细节
标签角度(srtCol=30)避免重叠
色阶图(keysize=2)辅助解读颜色映射
代码编写心得
数据准备
矩阵格式是热图函数的标准输入
行名保留物种信息便于解读
关键参数
r scale=“none” # 保持原始数值范围
tracecol=“grey50” # 轨迹线颜色淡化
dendrogram=“both” # 双向聚类