第六章 样本相似性可视化课堂练习
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 图形观察和代码编写的心得体会
图形观察心得 可视化效果:平行坐标图清晰展示了多维数据中不同Species的模式差异,线条和点标记的组合增强了可读性,颜色区分明显,便于比较不同类别 设计选择:灰色填充的点标记与彩色线条形成良好对比,图例位置(0.8,0.8)合理,不遮挡数据,x轴标签分两行有效解决了标签重叠问题
代码编写心得 数据处理:使用tidyr::gather()进行长宽转换是ggplot2绘图的良好实践,fct_inorder保持原始变量顺序很重要 图层叠加:先绘制线后绘制点的顺序确保了点的可见性,点线组合增强了可视化效果 主题优化:图例位置和格式的精细控制体现了专业水准,轴标签处理展示了实际问题解决能力
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 图形观察和代码编写的心得体会
- 图形观察心得 整体效果:扇形雷达图比线形雷达图更直观展示各变量占比,数据标准化使不同量纲的变量可比较,10行布局适合展示中等规模数据集 设计选择:完整圆形比多边形更美观,边距设置紧凑,最大化利用图形空间,标签大小(cex=0.6)防止重叠 代码编写心得 数据处理:矩阵转换是stars()函数的典型输入要求,保留行名有助于结果解读 参数选择:scale=TRUE是重要预处理步骤,draw.segments=TRUE创造更直观的扇形图 布局控制:nrow和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 图形观察和代码编写的心得体会
- 图形观察心得 整体效果:扇形雷达图比线形雷达图更直观展示各变量占比,数据标准化使不同量纲的变量可比较,10行布局适合展示中等规模数据集 设计选择:完整圆形比多边形更美观,边距设置紧凑,最大化利用图形空间,标签大小(cex=0.6)防止重叠 代码编写心得 数据处理:矩阵转换是stars()函数的典型输入要求,保留行名有助于结果解读 参数选择:scale=TRUE是重要预处理步骤,draw.segments=TRUE创造更直观的扇形图 布局控制:nrow和mar参数配合实现紧凑布局,key.loc需要根据实际图形调整
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创建交互式热图,交互式热图可以解决标签重叠问题并提供更多探索功能