暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

R语言数据分析 | 谱系图与聚类分析

4831
点击关注了解更多哦

谱系图是层次聚类分析中一种常见形式,聚类分析是指在n维空间中将点分配到类的一种方法。本文对R语言中绘制谱系图的绘图函数及相关package进行汇总,展示不同形式的谱系图绘制过程。

1.数据准备

国家统计局[1]官方网站上关于2020年我国31个省份人均GDP【单位:元】及年末常住人口【单位:万人】数据(未包含港澳台数据)为例,通过聚类分析构建谱系图。数据如下图所示,可在后台回复【20220114】获取。

2.数据处理

前期数据处理主要包括读入数据、为数据指定行名、选择待分析的数据列、对数据进行标准化等。

setwd("C:\\Users\\Acer\\Desktop"#设置工作路径
data <- read.csv("hclust.csv"#读入数据
head(data) #查看数据前几行
#  province Per.GDP  POP
#1     北京  164889 2189
#2     天津  101614 1387
#3     河北   48564 7464
str(data) #查看数据结构
#'data.frame': 31 obs. of  3 variables:
# $ province: chr  "北京" "天津" "河北" "山西" ...
# $ Per.GDP : int  164889 101614 48564 50528 72062 58872 50800 42635 155768 121231 ...
# $ POP     : int  2189 1387 7464 3490 2403 4255 2399 3171 2488 8477 ...
rownames(data) <- data$province #为数据指定行名
data <- data[,2:3] #选择进行谱系图聚类的数据。这里选择第2~3列,去除首列,因为首列为省份名字
head(data) #查看处理后的数据
#     Per.GDP  POP
#北京  164889 2189
#天津  101614 1387
#河北   48564 7464
data.s <- scale(data) #对数据进行标准化处理
head(data.s) #查看标准化后的数据
#         Per.GDP         POP
#北京  3.00399672 -0.77270137
#天津  0.98409230 -1.03531040
#河北 -0.70940322  0.95455881

3.使用hclust()函数绘制谱系图

3.1 确定计算距离方法与聚类方法

通过第2部分前期数据处理,接下来使用hclust()dist() 函数来绘制谱系图。其中dist() 函数用来计算数据之间的距离,hclust() 函数用来确定聚类方法,基本形式为:hclust(dist(data, method = "method"), method = "method")。此外,计算距离的方法有"euclidean"(欧几里德距离), "maximum", "manhattan"(曼哈顿距离), "canberra"(堪培拉距离), "binary", "minkowski"(闵可夫斯基距离);聚类方法有"ward.D", "single", "complete", "average", "mcquitty", "median", "centroid", "ward.D2"。

hc <- hclust(dist(data.s)) #默认情况下计算距离方法为“complete”,聚类方法为“euclidean”
hc #查看聚类结果
#Call:
#hclust(d = dist(data.s))
#Cluster method   : complete 
#Distance         : euclidean 
#Number of objects: 31 
hc_user <- hclust(dist(data.s, method="manhattan"), method = "ward.D"#自定义Cluster method与Distance method
hc_user #查看聚类结果
#Call:
#hclust(d = dist(data.s, method = "manhattan"), method = "ward.D")
#Cluster method   : ward.D 
#Distance         : manhattan 
#Number of objects: 31 

3.2 对聚类后的结果进行可视化

plot(hc, hang = -1) #左图,使用hang = -1可以使聚类标签对齐
plot(hc_user, hang = -1) #右图

4.使用ape包绘制谱系图

关于层次聚类还可以使用ape包(Analyses of Phylogenetics and Evolution)来绘制聚类图。本部分内容主要参考Gaston Sanchez[2]Visualizing Dendrograms in R

4.1 安装与加载package

install.packages("ape"#安装package
install.packages("RColorBrewer"#安装package
library(ape) #加载
library(RColorBrewer) #加载

4.2 树形聚类图

plot(as.phylo(hc), cex = 1, label.offset = 0.05, font = 1) # plot basic tree:基础谱系图(左图)
plot(as.phylo(hc), type = "cladogram", cex = 1, font = 1, label.offset = 0.05) # cladogram:分支型(右图)

参数解读as.phylo() 函数内为聚类后的数据,cex表示字体的大小,label.offset表示标签距离树枝的距离,font表示字体形状(粗体、斜体等),type表示选择聚类的样式,有cladogram、unrooted、fan、radial等形式。

4.3 圆形聚类图

plot(as.phylo(hc), type = "unrooted",font = 2, cex = 1.5, label.offset = 0.05) # unrooted:树形(左图)
plot(as.phylo(hc), type = "fan", font = 2, cex = 1.5) # fan:扇形(中图)
plot(as.phylo(hc), type = "radial", font = 2, cex = 1.5) # radial:放射形(右图)

4.4 对树形聚类图进行着色(根据聚类进行着色)。主要利用tip.color() 函数,同时指定颜色的数量与聚类的数量cutree()。利用RColorBrewer包对聚类图进行着色,关于RColorBrewer包的使用可参考之前推文,见R语言绘图|如何调用RColorBrewer包对图形颜色进行修改

#设置颜色与分支(颜色数量与分支数量要一致)
mypal = brewer.pal(6, "Dark2"#设置颜色
clus6 = cutree(hc, 6) #设置分支
plot(as.phylo(hc), cex = 0.9, tip.color = mypal[clus6], label.offset = 0.05,font = 1, no.margin = TRUE) # plot basic tree:基础谱系图
plot(as.phylo(hc), type = "cladogram", tip.color = mypal[clus6], cex = 1, font = 1, label.offset = 0.05) # cladogram:分支形

4.5 对圆形聚类图进行着色(根据聚类进行着色)

plot(as.phylo(hc), type = "unrooted", tip.color = mypal[clus6], font = 1, cex = 1.5) # fan:树形
plot(as.phylo(hc), type = "radial", tip.color = mypal[clus6], font = 1, cex = 1.5) # radial:放射形
plot(as.phylo(hc), type = "fan", tip.color = mypal[clus6], label.offset = 0.01, col = "red", cex = 1.5) # fan:扇形

5.使用A2R包绘制谱系图

A2R包未发布在CRAN上,需要以外部形式进行加载,关于A2R包的使用可以进一步参考A2Rplot[3]中的介绍。

source("http://addictedtor.free.fr/packages/A2R/lastVersion/R/code.R"#加载A2R包
cols = brewer.pal(6, "Dark2"#设置颜色
A2Rplot(hc, k = 6, boxes = FALSE, col.up = "black", col.down = cols, lty.up= 2, lwd.up = 1, lty.down = 1, lwd.down = 1)

参数解读hc为聚类后的数据,k为分类数量,boxes为FALSE时表示不加边框,boxes为TRUE时表示加边框,col.upcol.down分别为上、下线条颜色,lty为线条类型,lwd为线条厚度。

A2Rplot(hc, k = 6, boxes = TRUE, col.up = "black", col.down = cols, lty.up= 2, lwd.up = 1, lty.down = 1, lwd.down = 1)

6.输出谱系图数据

cluserdata <- cutree(hc, k=6) #hc为hclust()聚类后的data,k用来指定聚类的类别
#北京 天津 河北 山西 内蒙 辽宁 吉林 黑龙 上海 江苏 浙江 安徽 福建 江西 山东 河南 湖北 湖南 广东 广西 海南 重庆 四川 贵州 云南 
#   1    2    3    4    2    3    4    4    1    5    5    3    5    3    3    3    3    3    6    3    4    2    3    4    3 
#西藏 陕西 甘肃 青海 宁夏 新疆 
#   4    3    4    4    4    4 
write.csv(cluserdata, file = "cluster.csv"#写入csv文件

7.其他

plot() 函数是R语言绘图中一个常见的基础绘图函数,具体解读可参考R语言plot函数参数合集[4]。其基本参数如下:

#plot()绘图函数基础参数
plot(x, y = NULL, type = "p",  xlim = NULL, ylim = NULL,
     log = "", main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
     ann = par("ann"), axes = TRUE, frame.plot = axes,
     panel.first = NULL, panel.last = NULL, asp = NA,
     xgap.axis = NA, ygap.axis = NA,
     ...)


如有帮助请多多点赞哦!

参考资料

[1]

国家统计局: https://data.stats.gov.cn/index.htm

[2]

Gaston Sanchez. Visualizing Dendrograms in R: https://rstudio-pubs-static.s3.amazonaws.com/1876_df0bf890dd54461f98719b461d987c3d.html

[3]

A2Rplot.hclust {A2R}: http://addictedtor.free.fr/packages/A2R/lastVersion/html/A2Rplot.hclust.html

[4]

R语言plot函数参数合集: https://blog.csdn.net/glodon_mr_chen/article/details/79830576


文章转载自日常分享的小懒猫,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论