Posted on

绘制热图一般可以使用pheatmap包快速绘制,但是使用ggplot2可以实现更多自定义设置,下面代码使用自带mtcars包进行热图绘制,并添加列注释(y轴标签在最外面)

标签显示在最外面的原理很简单,就是热图不显示axis.text.y,而是添加的注释的那个条条添加axis.text.y,如果有多个,只有最外面的显示axis.text.y

library(ggplot2)
library(aplot)
library(tidyr)
library(dplyr)
##library(ggtree) ##绘制聚类树使用

p <- scale(mtcars) %>% data.frame()
p$mtxars <- rownames(p)

#按照实际顺序排列,不进行这一步ggplot默认字母顺序排列,图会乱掉
p$mtxars <- factor(p$mtxars,level = p$mtxars)

#宽表转长表
p1 <- gather(p, 1:11, key="condition", value='expr')
#绘制热图
pp1 <- ggplot(p1,aes(condition,mtxars)) +
  geom_tile(aes(fill=expr),colour = "white")+ 
  scale_fill_gradientn(values = seq(0,1,0.2),colours =  c('#6699CC','#FFFF99','#CC3333'))+
  theme_minimal()+
  scale_y_discrete(position="right")+
  xlab(NULL) + ylab(NULL)+
  theme(axis.text.y = element_blank())
pp2 <- ggplot(p1,aes(condition,mtxars)) +
  scale_color_gradientn(values = seq(0,1,0.2),colours =  c('#6699CC','#FFFF99','#CC3333'))+
  theme_bw()+
  geom_point(aes(size=expr,color=expr))+
  theme(panel.grid = element_blank(),axis.text.x =element_text(angle =90,hjust =0.5,vjust = 0.5))+
  xlab(NULL) + ylab(NULL)+
  theme(panel.border = element_rect(fill=NA,color="black", size=1, linetype="solid"),
        axis.text.y = element_blank())



Type_A <- rownames(p) %>% as.data.frame() %>%
  mutate(group=rep(c("A","B","C"),
                   times=c(10,10,12))) %>%
  mutate(p="")%>%
  ggplot(aes(p,.,fill=group))+
  geom_tile() + 
  scale_y_discrete(position="right") +
  theme_minimal()+xlab(NULL) + ylab(NULL) +
  theme(axis.text.y = element_blank())+
  labs(fill = "Type_A")
Type_B <- rownames(p) %>% as.data.frame() %>%
  mutate(group=rep(c("D","E","F"),
                   times=c(6,12,14))) %>%
  mutate(p="")%>%
  ggplot(aes(p,.,fill=group))+
  geom_tile() + 
  scale_y_discrete(position="right") +
  theme_minimal()+xlab(NULL) + ylab(NULL)+
  labs(fill = "Type_B")

pp1 %>%
  insert_left(Type_A, width = .05)%>%
  insert_left(Type_B,width=.05)

pp2 %>%
  insert_left(Type_A, width = .05)%>%
  insert_left(Type_B,width=.05)

4 Replies to “ggplot2绘制热图并添加注释信息”

  1. 进哥你好,看你发的帖子学到了很多,非常的感谢!我想绘制一个热图:圆圈的大小表示一个参数,同一个圆圈颜色的深浅表示另外一个参数,这应该怎么调用程序呢?非常感谢您的帮助!

  2. 王老师,请问可以使Y轴按照insert的注释条的Type类型排序吗?就是使Y轴按照红色、绿色和蓝色依次排列,谢谢指导!

    1. 可以的 设置一下排序,已更新博文
      如果有其它顺序,排序之后重新设置factor

      #按照实际顺序排列,不进行这一步ggplot默认字母顺序排列,图会乱掉
      p$mtxars <- factor(p$mtxars,level = p$mtxars)

发表评论

邮箱地址不会被公开。 必填项已用*标注