第六章 样本相似性可视化课堂练习
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 图形观察和代码编写的心得体会
- 观察心得:平行坐标图通过多变量平行轴线展示多维数据关系;不同物种(Species)在花瓣/萼片尺寸上呈现明显聚类特征;Setosa在Sepal.Width上明显偏大,而在Petal维度偏小
- 代码心得:使用gather+tidyr实现宽转长数据转换;fct_inorder保持变量原始顺序;geom_line+geom_point组合增强可视化效果;通过scale_x_discrete优化标签显示;图例参数精细控制提升可读性
2.2 雷达图
- 采用
ggiraphExtra::ggRadar
绘图
2.2.1 图形观察和代码编写的心得体会
图形观察心得:雷达图 直观展示不同 Species 在多指标上的分布差异;Setosa 在 Petal.Length/Petal.Width 上明显偏小,但在 Sepal.Width 上较高;Versicolor 和 Virginica 形态相似,但后者整体数值更大;归一化后 数据范围统一,便于比较不同量纲的变量
代码编写心得:ggRadar() 直接绘制雷达图,比传统 coord_polar() 更便捷;rescale=FALSE 保持原始数据范围,避免归一化失真;alpha 调节透明度,避免多组数据重叠遮挡;自定义 mytheme 统一风格,提升可读性(如蓝色坐标轴标签);ylim 固定坐标范围,确保不同图表可比性
3 星图和脸谱图
3.1 星图
采用
stars
函数,对标准化数据绘制圆弧星图需要先将四个数值变量转化为矩阵,并将
Species
作为矩阵的行名;设置图例在合适位置,能完整显示;将图形分为10行。
3.1.1 图形观察和代码编写的心得体会
图形观察心得:星形图/雷达图变体,用扇形面积代替折线,更强调数值占比;Setosa 的 Sepal.Width 占比突出,Petal 相关变量占比极小,与其他物种差异显著;Virginica 整体数值更大,扇形分布均匀,Petal 部分占比高于其他物种;多行排列(nrow=10) 便于同类对比,避免重叠
代码编写心得: stars() 快速绘制多变量星形图,支持矩阵输入(需先剔除分类变量);draw.segments=TRUE;切换为扇形模式,直观展示比例关系;scale=TRUE 自动归一化,消除量纲影响;key.loc 调整图例位置,避免遮挡图形主体;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 图形观察和代码编写的心得体会
图形观察心得:Chernoff Faces(脸谱图) 通过面部特征(如眼睛大小、嘴型)编码多维数据,直观反映不同 Species 的均值差异;Setosa 的脸型明显不同(如更窄的脸型),对应其较小的 Petal 数值;Virginica 的五官比例更夸张(如更大的眼睛/嘴),反映其整体数值较大;适用于快速识别异常模式,但需结合具体变量含义解读
代码编写心得:aplpack::faces() 直接调用脸谱图方法,需提前按组聚合数据(如均值);face.type=1 选择脸谱风格,不同风格对应不同变量映射规则;scale=TRUE 标准化数据,避免单一变量主导面部特征;ncol.plot 控制排版,避免图形重叠;矩阵输入需设置行名(如 row.names(mat) <- mat$Species)
4 聚类图和热图
4.1 系统聚类树状图
- 采用
factoextra::fviz_dend
函数,对标准化后数据作图; - 需要先将四个数值变量转化为矩阵,并将
Species
作为矩阵的行名; - 要求分为3类,观察分类结果和
Species
的差异;树状图的外观为圆形。
4.1.1 图形观察和代码编写的心得体会
图形观察心得:层次聚类树状图:清晰展示 Iris 数据 的 3 类自然分组,与真实物种分类高度吻合,Setosa(红色)明显分离,Versicolor(绿色)和 Virginica(蓝色)部分重叠,符合实际生物学特征;圆形布局(type=“circular”) 节省空间,但可能降低长分支的可读性;矩形色块(rect=TRUE) 直观标记聚类结果,增强可解释性
代码编写心得:数据预处理:剔除分类变量(select(-Species)),标准化数据(scale(mat)) 使用 欧氏距离(method=“euclidean”) + Ward 方法(method=“ward.D2”) 提升聚类效果; 可视化优化:fviz_dend() 替代基础 plot(),支持高级定制(颜色、布局、标签);brewer.pal() 调用 ColorBrewer 配色,提升美观性;参数 rect_fill=TRUE 和 color_labels_by_k=TRUE 自动匹配颜色与聚类。灵活性:通过 type 切换树状图布局(矩形/圆形/等),k 参数动态调整聚类数量
4.2 K-menas聚类主成分图
采用
factoextra::fviz_cluster
函数,对标准化后数据作图;需要先将四个数值变量转化为矩阵,并将
1:150
作为矩阵的行名;要求分为3类,类别轮廓为正态分布,观察哪些观察值比较异常。
4.2.1 图形观察和代码编写的心得体会
图形观察心得:K-means聚类结果 将数据分为3类,与Iris原始分类(Species)高度吻合,验证了数据本身的自然分组特性。Setosa(绿色)完全独立,Versicolor(蓝色)和 Virginica(红色)部分重叠,符合实际生物学特征。置信椭圆(ellipse.type=“norm”) 清晰展示各类的分布范围,Setosa的椭圆明显分离,其余两类存在交叉。repel=TRUE 有效避免标签重叠,提升可读性。
代码编写心得:数据预处理:剔除分类变量(select(-Species)),标准化(scale())消除量纲影响。矩阵格式输入适合 kmeans() 计算。聚类与可视化:kmeans() 快速实现聚类,centers=3 指定分类数。fviz_cluster() 一键生成专业级可视化,支持椭圆、标签防重叠等高级功能。参数优化:labelsize 和 pointsize 平衡图形细节与整洁度。标题(main)直接注明方法,提升图表自解释性。
4.3 热图
采用
gplots::heatmap.2
函数,对原始数据绘制热力图需要先将四个数值变量转化为矩阵,并将
Species
作为矩阵的行名;要求横轴和纵轴均添加聚类树状图
4.3.1 图形观察和代码编写的心得体会
图形观察心得:热图 清晰展示 Iris 各样本 在4个数值变量上的分布模式,颜色梯度直观反映数值大小。行聚类(样本) 显示 Setosa 明显分离,Versicolor 和 Virginica 部分混合,与真实分类一致。列聚类(变量) 中 Petal.Length 和 Petal.Width 高度相关(颜色模式相似),符合生物学特性。色键(Color Key) 提供数值-颜色映射参考,边缘留白(margins) 避免标签截断。
代码编写心得:数据准备:矩阵输入(as.matrix()),行名设为物种标签(rownames(mat)=data[,5])。核心函数:heatmap.2() 集成聚类与热图绘制,支持行列双聚类(dendrogram=“both”)。 关键参数:col=rainbow(256) 自定义颜色梯度,tracecol 添加轨迹线提升可读性。cexRow/cexCol 调整标签字体大小,srtCol 旋转列标签。keysize 控制色键比例,key.title 添加标题。