第六章 样本相似性可视化课堂练习

Author

221527207刘润钿

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 类的花通常较小,花瓣短而宽,与其他两类差异明显;versicolorvirginica 在部分特征上有重叠,分类难度更高。

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 添加标题。