R数据可视化24: 环状热图

懒人617回归,其实并没有偷懒。最近一直忙碌于手中的课题,没有时间来写文(当然这都不是借口)。作为一个有包袱的生信博主,我要守护住我的优秀创作者徽章。废话不多说,今天我们共同关注环状热图(circo heatmap)。

什么是环状热图

环状热图,顾名思义,就是热图的一种形式。按照我导的话就是,任何东西变成一个圈,就酷炫了起来,那么热图也是如此。首先,给大家展示几张环状热图。


来源:datavizproject(这张严格意义讲不属于环状热图,不过好看就放上来了)

来源:Cell (2021)

来源:circular visualization

环状热图的好处是可以在一张图上展示多个方面,很省空间,非常适合用于多组或者多组学的研究,因为可以揭示不同组学的变化规律和联系。当然如果要进一步解释数据的关系,那么环状热图可能就有点“花里胡哨”了。

如何做环状热图

今天我们来讲一个有意思的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: 火山图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容