第六章 样本相似性可视化课堂练习
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 图形观察和代码编写的心得体会
图形区别观察:平行坐标图通过多条平行轴线展示多维数据,不同颜色的折线代表不同鸢尾花种类,可直观比较各指标(花萼/花瓣长宽)的分布差异及跨指标关联性。
代码编写心得:通过
gather()
整理数据为长格式,利用geom_line()
+geom_point()
组合增强可视化层次;图例和标签的精细调整(如换行、颜色、位置)。
2.2 雷达图
- 采用
ggiraphExtra::ggRadar
绘图
2.2.1 图形观察和代码编写的心得体会
图形区别观察:雷达图通过多边形放射状轴线展示不同鸢尾花种类(Species)在各指标上的分布,便于对比组间差异,而平行坐标图侧重跨指标的趋势追踪。
代码编写心得:
ggRadar()
需关闭rescale
保持原始数值范围,通过alpha
和size
调整图形透明度与线条粗细;自定义主题(mytheme
)统一了坐标轴与图例风格。
3 星图和脸谱图
3.1 星图
采用
stars
函数,对标准化数据绘制圆弧星图需要先将四个数值变量转化为矩阵,并将
Species
作为矩阵的行名;设置图例在合适位置,能完整显示;将图形分为10行。
3.1.1 图形观察和代码编写的心得体会
图形区别观察:星形图(stars plot)通过放射状线段或扇形区块(
draw.segments=TRUE
)直观呈现不同鸢尾花种类在各指标上的数值分布,与雷达图类似但更强调局部占比,适合快速对比多变量比例关系。代码编写心得:数据需转换为矩阵并标准化(
scale=TRUE
),通过draw.segments
切换线段/扇形模式;调整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)的差异以拟人化方式呈现,相比传统图表更生动但需适应抽象映射。
代码编写心得:需预先按组计算均值并转为矩阵,
face.type
控制风格,ncol.plot
调整布局;数据标准化(scale=TRUE
)确保特征比例一致,但需注意面部特征与变量的对应关系可能不直观。
4 聚类图和热图
4.1 系统聚类树状图
- 采用
factoextra::fviz_dend
函数,对标准化后数据作图; - 需要先将四个数值变量转化为矩阵,并将
Species
作为矩阵的行名; - 要求分为3类,观察分类结果和
Species
的差异;树状图的外观为圆形。
4.1.1 图形观察和代码编写的心得体会
图形区别观察:层次聚类树状图(Dendrogram)通过分支高度和颜色区块(
rect=TRUE
)展示样本间欧式距离(method="euclidean"
)和聚类结果(3类),圆形布局(type="circular"
)增强空间利用率,适合观察样本层次关系。代码编写心得:数据需标准化(
scale(mat)
)并计算距离矩阵,ward.D2
方法优化类间距离;通过fviz_dend
的k_colors
和rect
参数增强可读性,但圆形布局可能降低高度差异的直观性。
4.2 K-menas聚类主成分图
采用
factoextra::fviz_cluster
函数,对标准化后数据作图;需要先将四个数值变量转化为矩阵,并将
1:150
作为矩阵的行名;要求分为3类,类别轮廓为正态分布,观察哪些观察值比较异常。
4.2.1 图形观察和代码编写的心得体会
图形区别观察:K-means聚类图通过散点分布和置信椭圆(
ellipse.type="norm"
)直观展示3个聚类中心的划分结果,相比层次聚类更强调全局分组边界,适合非层次结构的硬聚类分析。异常观察值:42号,61号,118号,132号
代码编写心得:数据标准化(
scale()
)是关键步骤;repel=TRUE
避免标签重叠,ellipse.type
增强组间区分度,但需注意初始中心点随机性可能导致结果波动。
4.3 热图
采用
gplots::heatmap.2
函数,对原始数据绘制热力图需要先将四个数值变量转化为矩阵,并将
Species
作为矩阵的行名;要求横轴和纵轴均添加聚类树状图
4.3.1 图形观察和代码编写的心得体会
图形区别观察:热图通过颜色梯度(
col=rainbow(256)
)直观展示不同鸢尾花种类(行)在各指标(列)上的数值分布,结合行列聚类树状图(dendrogram="both"
)揭示数据层次结构,适合快速识别高/低值区域与模式关联。代码编写心得:需关闭默认标准化(
scale="none"
)保持原始值,tracecol
添加辅助线增强可读性;调整边距(margins
)和标签角度(srtCol
)优化布局,但色阶选择(如彩虹色)可能影响数值对比精度。