其他
R语言画好看的聚类树
本次例子用到的R包主要有
TreeAndLeaf
、RedeR
、igraph
、RColorBrewer
,示例数据来自于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.mapv
、att.mape
、att.addv
、att.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.生物信息学学习资料和自己的学习笔记!