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

Author

kaka

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的模式差异,线条和点标记的组合增强了可读性,颜色区分明显,便于比较不同类别。图层叠加:先绘制线后绘制点的顺序确保了点的可见性,点线组合增强了可视化效果。

2.2 雷达图

  • 采用ggiraphExtra::ggRadar 绘图

2.2.1 图形观察和代码编写的心得体会

  • 雷达图适合展示多个变量(维度)的数据,每个变量对应一个坐标轴,所有轴从中心点向外辐射,形成网状结构。不归一化保留了原始数据尺度,便于直接比较通过将不同数据系列绘制在同一雷达图上,可以直观对比多个对象在多个维度上的差异。

  • 通过预定义 mytheme 统一图表风格,避免重复代码。确保了多图表视觉一致性,提升可维护性。

    rescale=FALSE:保留原始数据尺度,避免标准化导致的数值误解,适合强调绝对差异的场景。

    alpha=0(填充透明)与 size=2(轮廓加粗):凸显多边形边界,防止重叠区域视觉混淆。

3 星图和脸谱图

3.1 星图

  • 采用stars 函数,对标准化数据绘制圆弧星图

  • 需要先将四个数值变量转化为矩阵,并将Species 作为矩阵的行名;

  • 设置图例在合适位置,能完整显示;将图形分为10行。

3.1.1 图形观察和代码编写的心得体会

  • 每个变量由一个放射状轴线表示,所有轴线从中心点向外延伸,形成星形结构。适合比较多个对象在相同维度上的表现。可以通过直观的形状差异,即数据点连线形成封闭多边形,来反映整体特征:面积大即综合表现强,凸起/凹陷表示某维度的优势/短板。

  • 将数据转换成矩阵格式提升计算效率,通过参数full=TRUE,设置星图的形状,通过设置参数scale=TRUE:自动标准化数据到 [0,1],解决多量纲维度可比性问题。通过设置参数draw.segments=TRUE,切换为扇形区块图(替代多边形连线),增强视觉区分度,适合离散型维度。

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 图形观察和代码编写的心得体会

  • 每个变量(如 Sepal.Length)对应面部特征(如鼻子长度、嘴巴弧度等),通过五官形态差异反映数值大小。同一类别的脸谱通常相似,而不同类别间差异明显,验证了数据的分组特性。

  • 确保行名为分类标签,增强可读性;删除非数值列(如 Species)避免干扰。通过设置参数,face.type=1:选择预设的脸部特征映射方案,不同 face.type 可能突出不同变量差异。ncol.plot=3:控制每行显示的脸谱数量,匹配分类数(如3种鸢尾花)可优化布局。cex=1:调整标签字体,避免小标签导致物种名称重叠。

4 聚类图和热图

4.1 系统聚类树状图

  • 采用factoextra::fviz_dend 函数,对标准化后数据作图;
  • 需要先将四个数值变量转化为矩阵,并将Species 作为矩阵的行名;
  • 要求分为3类,观察分类结果和Species 的差异;树状图的外观为圆形。

4.1.1 图形观察和代码编写的心得体会

  • 通过三种不同的颜色区分不同的类别,颜色区分明显,矩形框和颜色填充直观展示了聚类分组。标签处理:cex=0.6适当缩小了标签大小,避免重叠color_labels_by_k=TRUE使标签颜色与聚类一致。

  • 在计算距离前进行标准化,确保不同量纲的变量对距离计算贡献均衡。选择欧式距离和ward.D2方法,fviz_dend()提供了丰富的树状图定制选项。

4.2 K-menas聚类主成分图

  • 采用factoextra::fviz_cluster 函数,对标准化后数据作图;

  • 需要先将四个数值变量转化为矩阵,并将1:150 作为矩阵的行名;

  • 要求分为3类,类别轮廓为正态分布,观察哪些观察值比较异常。

4.2.1 图形观察和代码编写的心得体会

  • 图形直观展示了3个聚类在降维空间(可能是PCA)中的分布,置信椭圆帮助判断每个聚类的紧密程度和重叠情况 标签处理:repel=TRUE有效避免了标签重叠,提高可读性,标签大小(labelsize)和点大小(pointsize)的调整使图形更平衡 ,使用fviz_cluster()默认使用PCA,将高维数据通过二维展示,实现可视化。

  • 在聚类前进行数据标准化(scale()),确保不同量纲的变量对距离计算有同等贡献

    可视化优化:fviz_cluster()提供了专业级的聚类可视化

4.3 热图

  • 采用gplots::heatmap.2 函数,对原始数据绘制热力图

  • 需要先将四个数值变量转化为矩阵,并将Species 作为矩阵的行名;

  • 要求横轴和纵轴均添加聚类树状图

4.3.1 图形观察和代码编写的心得体会

  • rainbow(256)提供了鲜艳的颜色渐变。 标签处理:调整标签角度(srtCol)和位置(adjCol)确实能改善长标签的可读性,标签大小调整(cex)对于大量行/列的数据特别重要。 树状图的展示能同时显示行列聚类(dendrogram=“both”)有助于观察双向关系,但要注意聚类方法默认使用欧式距离。

  • 使用管道操作符(%>%)进行矩阵转换和行名设置,使数据处理流程更加清晰。heatmap.2可以精细控制图形外观,边距、标签、色键等。