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

Author

221527136邹伟亮

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

  • 图形观察

    • 折线图展示鸢尾花四个特征(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” # 双向聚类