懒人617回归,其实并没有偷懒。最近一直忙碌于手中的课题,没有时间来写文(当然这都不是借口)。作为一个有包袱的生信博主,我要守护住我的优秀创作者徽章。废话不多说,今天我们共同关注环状热图(circo heatmap)。
什么是环状热图
环状热图,顾名思义,就是热图的一种形式。按照我导的话就是,任何东西变成一个圈,就酷炫了起来,那么热图也是如此。首先,给大家展示几张环状热图。
环状热图的好处是可以在一张图上展示多个方面,很省空间,非常适合用于多组或者多组学的研究,因为可以揭示不同组学的变化规律和联系。当然如果要进一步解释数据的关系,那么环状热图可能就有点“花里胡哨”了。
如何做环状热图
今天我们来讲一个有意思的R包“circlize”。没错,是一个将各种图环化的包。其中有一个名为“circos.heatmap()”的函数,可以用于绘制环状图。这个函数是依赖于“ComplexHeatmap”包的(这也是一个非常好用的R包,有兴趣的人可以尝试一下)。所以,我们首先要安装上这些相关的包。
然后我们来看一下数据格式(因为最近是用了课题数据做了这个图,不方便展示,所以就用包里自带的例子了~~)。
mat1 = rbind(cbind(matrix(rnorm(50*5, mean = 1), nr = 50),
matrix(rnorm(50*5, mean = -1), nr = 50)),
cbind(matrix(rnorm(50*5, mean = -1), nr = 50),
matrix(rnorm(50*5, mean = 1), nr = 50))
)
rownames(mat1) = paste0("R", 1:100)
colnames(mat1) = paste0("C", 1:10)
mat1 = mat1[sample(100, 100), ] # randomly permute rows
数据格式其实非常简单,和大部分做heatmap的包一样,要求matrix格式。每一列就是一个组,每一行就是具体的指标。
接下来我们看一下如何做图。做最基本的环状热图非常容易。
library(circlize)
library(ComplexHeatmap)
#绘制circoheatmap
col_fun1 = colorRamp2(c(-2, 0, 2), c("navy", "white", "firebrick3"))
circos.heatmap(mat1, col = col_fun1,dend.side = "inside",rownames.side = "outside")
#用于绘制legend
lgd = Legend(title = "mat1", col_fun = col_fun1)
grid.draw(lgd)
circos.clear()#一定要注意加上这个表示热图绘制完毕
(-2,0,2)是对应的legend里面的数值范围,可以根据需要进一步调整,后面的自然就是热图对应的颜色。
dend.side是用于确定clustering结果放在圈内还是圈外,rownames.side同理。
下面就是通过上述代码得到的最简单的热图了:
当然我们可以进一步加入更多的信息,比如组名(C1-C10)。我们可以用circos.text()和circos.track()来完成这件事。但是需要调试一下参数,将标签添加到合适的位置。
col_fun1 = colorRamp2(c(-2, 0, 2), c("navy", "white", "firebrick3"))
circos.par(gap.after = c(10))#空出一段用于添加label
circos.heatmap(mat1, col = col_fun1,dend.side = "inside",rownames.side = "outside",track.height = 0.4)
circos.track(track.index = get.current.track.index(), panel.fun = function(x, y) {
if(CELL_META$sector.numeric.index == 1) { # the last sector
cn = colnames(mat1)
n = length(cn)
circos.text(rep(CELL_META$cell.xlim[2], n) + convert_x(0.1, "mm"), #x坐标
13+(1:n)*5,#y坐标
cn, #标签
cex = 0.5, adj = c(0, 1), facing = "inside")
}
}, bg.border = NA)
lgd = Legend(title = "mat1", col_fun = col_fun1)
grid.draw(lgd)
circos.clear()
当然我们还可以添加新的环状热图(我懒得调整上一个label的位置了就去掉了,哈哈):
#生成一组新的数据
mat2 = mat1[sample(100, 100), ]
col_fun1 = colorRamp2(c(-2, 0, 2), c("navy", "white", "firebrick3"))
col_fun2 = colorRamp2(c(-2, 0, 2), c("green", "white", "red"))
circos.par(gap.after = c(10))
circos.heatmap(mat1, col = col_fun1,rownames.side = "outside",track.height = 0.2)
circos.heatmap(mat2, col = col_fun2,dend.side = "inside",track.height = 0.2)
lgd = Legend(title = "mat1", col_fun = col_fun1)
grid.draw(lgd)
circos.clear()
今天的分享就到这里啦(我要去吃烧烤了好饿),这个包还有很多的内容大家可以自己自己去看,链接在此:https://jokergoo.github.io/circlize_book/book/
往期R数据可视化分享
R数据可视化23:Treemap图
R数据可视化22: 怎么获取CNS级颜色搭配
R数据可视化21: Edge Bundling图
R数据可视化20: 弦图
R数据可视化19: 环状条形图
R数据可视化18: 弧形图
R数据可视化17: 桑基图
R数据可视化16: 哑铃图
R数据可视化15: 倾斜图 Slope Graph
R数据可视化14: 生存曲线图
R数据可视化13: 瀑布图/突变图谱
R数据可视化12: 曼哈顿图
R数据可视化11: 相关性图
R数据可视化10: 蜜蜂图 Beeswarm
R数据可视化9: 棒棒糖图 Lollipop Chart
R数据可视化8: 金字塔图和偏差图
R数据可视化7: 气泡图 Bubble Plot
R数据可视化6: 面积图 Area Chart
R数据可视化5: 热图 Heatmap
R数据可视化4: PCA和PCoA图
R数据可视化3: 直方/条形图
R数据可视化2: 箱形图 Boxplot
R数据可视化1: 火山图