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

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

  • 绘制平行坐标图,一条折线代表一个id在4个指标的表现,从图像上看,三个品种的鸢尾花在Sepal.Width比较接近,在其他三种指标差别比较明显。setosa品类在各个指标表现数值较低,推测花的大小比较另外两类较小,且该类数值比较集中,变异程度小。versicolor类和virginica类在四个指标分布形状相似,但是virginica的分布数值更大,推测virginica花较大。

  • 数据是长格式数据,绘图时,x轴使用因子化的“指标”变量,y则是具体数值。group使用id(一条折线代表一个id)。

    legend.background=element_blank(),将图例的背景填充色和边框全部设为透明,使图例看起来像是 “悬浮” 在图形上。

    scale_x_discrete(guide=guide_axis(n.dodge = 2),将 x 轴标签分成多行排列(这里是 2 行),减少水平方向的拥挤。对连续型变量(如数值)无效。

2.2 雷达图

  • 采用ggiraphExtra::ggRadar 绘图

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

  • 图形观察心得 可视化效果:雷达图非常适合展示多变量数据中各组的轮廓特征,不归一化保留了原始数据尺度,便于直接比较,透明填充使多条雷达线更清晰可辨 设计选择:蓝色坐标轴标签与雷达图线条形成良好对比,右侧图例位置合理,不干扰图形主体,点的大小适中,既突出关键点又不显突兀

  • 代码编写心得 主题定制:单独定义mytheme使代码结构更清晰,便于在多个图形间保持一致的风格 参数选择:rescale=FALSE保留了原始数据特性,alpha=0和size=2的组合创造了清晰的轮廓效果 函数使用:ggRadar()提供了简洁的雷达图创建接口,与ggplot2语法风格一致,便于扩展

3 星图和脸谱图

3.1 星图

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

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

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

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

图形观察心得 可视化效果:星形图通过扇形分区直观呈现多变量分布特征,数据归一化(scale=TRUE)消除量纲差异,便于跨维度比较,色彩填充区块强化了变量对比度 设计选择:紧凑的边界设置(mar)提升空间利用率,10行布局(nrow)实现多组数据的规整排列,极坐标刻度标签(cex=0.6)保持可读性同时避免重叠 颜色分段(draw.segments)增强数据维度识别性,图例定位(key.loc)与主图形成空间平衡

代码编写心得 数据处理:select剔除分类变量保证矩阵数值特性,行名绑定(rownames)保留分类标识 参数配置:full=TRUE构建完整圆形坐标系,len=1固定径向比例尺度,frame.plot=TRUE添加参考框架 函数应用:stars基础绘图函数实现快速星图构建,segment模式切换灵活改变可视化形态 布局优化:通过mar参数精细控制四周边距,key.loc坐标定位实现图例与主图的空间解耦

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脸谱图通过拟人化面部特征编码多维数据,物种间的形态差异直观反映指标差异,scale=TRUE消除量纲实现跨变量可比性,统一的脸谱类型(face.type=1)确保特征对比一致性
    设计选择:3列布局(ncol.plot)使多组数据呈现紧凑对齐,原始数据尺度映射保留生物学意义,面部器官比例变化凸显关键变量区分度
    标签字号(cex=1)与脸谱尺寸协调,五官特征与数据维度绑定形成视觉隐喻

    代码编写心得
    数据聚合:按物种分组汇总均值凸显组间差异,剔除分类变量后矩阵化符合函数输入要求,行名绑定实现脸谱与物种自动关联
    参数调优:scale标准化平衡不同量纲特征影响,face.type指定统一编码规则增强可比性,ncol.plot控制多图排列密度
    函数特性:aplpack::faces()实现复杂面部特征映射,五官参数自动匹配数据维度,基础图形系统无缝集成
    呈现优化:通过cex参数微调标签可读性,矩阵化数据结构确保特征映射准确性,分组均值计算聚焦物种层面差异

4 聚类图和热图

4.1 系统聚类树状图

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

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

  • 图形观察心得 树状图展示:圆形布局(circular)比传统矩形布局更节省空间,颜色区分明显,但k=3与4种颜色的设置不一致需要注意 聚类效果:ward.D2方法通常能产生平衡的聚类结果,矩形框和颜色填充直观展示了聚类分组 标签处理: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)提供了鲜艳的颜色渐变,但可能不是最佳选择 彩虹色系有时会导致视觉上的不连续感,可以考虑heat.colors()或viridis等更专业的色系 标签处理:调整标签角度(srtCol)和位置(adjCol)确实能改善长标签的可读性,标签大小调整(cex)对于大量行/列的数据特别重要 树状图展示:同时显示行列聚类(dendrogram=“both”)有助于观察双向关系,但要注意聚类方法默认使用欧式距离,可能不适合所有数据类型

  • 代码编写心得 数据流清晰:使用管道操作符(%>%)使数据处理流程更加清晰,矩阵转换和行名设置一气呵成

    参数丰富:heatmap.2()提供了大量可调参数,可以精细控制图形外观,边距、标签、色键等都能灵活调整

    交互性:静态热图有限,可以考虑plotly或d3heatmap创建交互式热图,交互式热图可以解决标签重叠问题并提供更多探索功能