第六章 样本相似性可视化课堂练习
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 图形观察和代码编写的心得体会
绘制平行坐标图,一条折线代表一个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创建交互式热图,交互式热图可以解决标签重叠问题并提供更多探索功能