查看原文
其他

R语言画好看的聚类树

阿越 医学和生信笔记 2023-02-25

本次例子用到的R包主要有TreeAndLeafRedeRigraphRColorBrewer,示例数据来自于Rflexclust包的nutrient数据。

加载数据和R包

library(TreeAndLeaf)
library(RedeR)
library(igraph)
library(RColorBrewer)

data(nutrient, package = "flexclust") # 加载数据

对数据进行简单的查看和处理

head(nutrient) # 简单看一下数据

energy protein fat calcium iron
beef braised 340 20 28 9 2.6
hamburger 245 21 17 9 2.7
beef roast 420 15 39 7 2.0
beef steak 375 19 32 9 2.6
beef canned 180 22 10 17 3.7
chicken broiled 115 20 3 8 1.4

row.names(nutrient) <- tolower(row.names(nutrient)) # 把行名变成小写

聚类分析

hc <- hclust(dist(nutrient))

画图

tal <- treeAndLeaf(hc) # 转化为树和叶的形式,其实是转化为igraph对象

rdp <- RedPort()
calld(rdp)
resetd(rdp)
addGraph(obj = rdp, g = tal)
relax(rdp, p1=25, p2=200, p3=5, p5=5, ps=TRUE) # 调节图形

这样就画出来一张聚类树的图:

是不是比传统的聚类分析的图更加好看和新颖呢?这是一个交互式的图形,旁边还有一个调整框,可以自己调节树枝的长度、叶子的大小等,主要是p1/p2/p3/p5这几个参数比较有用,其他参数大家可以自行探索。

继续美化图形

这个包的强大之处在于可以为图形添加各种映射,类似ggplot2,比如把某一列的值映射为图形颜色,点的大小等。主要就是理解att.mapvatt.mapeatt.addvatt.adde四个函数。

  • att.addv:给增加一个固定值的属性
  • att.adde:给树枝增加一个固定值的属性
  • att.mapv:给增加一个渐变属性
  • att.mape:给树枝增加一个渐变属性

具体用法可使用?att.mapv查看官方说明。

接下来就是给图形添加各种属性,这个操作还是和ggplot2的图层理念有些类似,一点点叠加。

tal <- att.mapv(tal, nutrient, refcol = 0)
pal <- brewer.pal(9,'Greens') # 设定颜色
tal <- att.setv(tal, from = 'calcium', to = 'nodeColor',cols = pal, nquant = 5) # 根据calcium确定点的颜色,nquant = 5表示颜色分为5段
tal <- att.setv(g = tal, from = "protein", to = "nodeSize", xlim = c(5,30,5), nquant = 5) # 把protein的大小映射为点的大小,最小设置为5,最大30,5个分段

tal <- att.addv(tal, "nodeFontSize", value = 15, index = V(tal)$isLeaf) # 给点添加条件
tal <- att.adde(tal, "edgeWidth", value = 3) # 给线添加条件

rdp <- RedPort()
calld(rdp)
resetd(rdp)

addGraph(obj = rdp, g = tal)
relax(rdp, p1=25, p2=200, p3=5, p5=5, ps=TRUE)

# 添加图例
addLegend.color(obj = rdp, tal, title = "Murder Rate", position = "topright")
addLegend.size(obj = rdp, tal, title = "Urban Population Size", position = "bottomright")

这样就给图形添加了不同的颜色和大小,同时增加图例加以说明:

这幅图还有很多细节可以修改,大家可以自行探索

可视化大型聚类树

# 加载R包和数据
library(TreeAndLeaf)
library(RedeR)
library(igraph)
library(RColorBrewer)

# 聚类分析
hc <- hclust(dist(quakes), "ave")
plot(hc, main="Dendrogram for the 'quakes' dataset", xlab="", sub="")

默认画出来的图很丑:

接下来进行美化:

# 转换对象
tal <- treeAndLeaf(hc)

# 增加图形映射
tal <- att.mapv(tal, quakes, refcol = 0)
pal <- brewer.pal(9, "Greens")
tal <- att.setv(g = tal, from = "mag", to = "nodeColor", cols = pal, nquant = 10)
tal <- att.setv(g = tal, from = "depth", to = "nodeSize", xlim = c(40, 120, 20), nquant = 5)

tal <- att.addv(tal, "nodeFontSize", value = 1)
tal <- att.adde(tal, "edgeWidth", value = 10)

rdp <- RedPort()
calld(rdp)
resetd(rdp)

addGraph(obj = rdp, g = tal, gzoom=10)
relax(rdp, p1=25, p2=200, p3=10, p4=100, p5=10, ps=TRUE)

addLegend.color(obj = rdp, tal, title = "Richter Magnitude", position = "bottomright")
addLegend.size(obj = rdp, tal, title = "Depth (km)")

这样的一幅图是不是比刚才那个好看多了!

TreeAndLeaf这个包还有很多其他的例子,出图效果一级棒,大家可以直接去官网[1]学习。

参考资料

[1]

TreeAndLeaf: http://bioconductor.org/packages/release/bioc/vignettes/TreeAndLeaf/inst/doc/TreeAndLeaf.html。


欢迎大家关注我的公众号:医学和生信笔记

医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存