ggplot2优雅的绘制热图

之前写过了不少绘制热图的文档,但是总感觉有不少细节没有交代清楚,今天统一再详细描述一次,希望各位观众老爷以后绘制热图再也没有困惑

加载R包

library(tidyverse)
library(ggtree)
library(aplot)

构建数据集

set.seed(56489)                                    
df <- data.frame(x = rep(LETTERS[1:20], each =20),
                   y = letters[1:20],
                   value= runif(50,0,20)) %>% 
  pivot_wider(names_from=x,values_from=value) %>% 
  column_to_rownames("y")

数据标准化处理

scale()函数会同时对数据进行标准化&中心化,center = F表示只对数据进行标准化处理,标准化后的数据变为矩阵因此需要将其转化为数据框

df %>% scale() %>% as.data.frame()
df %>% scale(center = F) %>% as.data.frame()

但是通常情况下我们一般对数据取log10(),由于数据中存在0因此对所有数据先+1

热图绘制

可以看到设置了2个geom_point,第1个用于设置填充的形状,第2个用于设置点的大小,show.legend=F表示移除图例,guides对刻度条进行设置

heatmap <- df %>% mutate_if(is.numeric,function(x) x+ 1) %>%
  log10() %>% 
  rownames_to_column("id") %>% 
  pivot_longer(-id) %>% 
  ggplot(.,aes(x=name,y=id,color=value))+
  geom_tile(color="grey70",fill="white",size=0.6)+
  geom_point(shape=19)+
  geom_point(aes(size=abs(value)),show.legend = F)+
  labs(x = NULL,y = NULL,color=NULL) + 
  scale_color_viridis_c()+
  scale_x_discrete(expand=c(0,0)) +
  scale_y_discrete(expand=c(0,0),position="right")+
  theme(text=element_text(family="Roboto"),
        axis.text.x=element_text(color="black"),
        axis.text.y=element_text(color="black"),
        axis.ticks.x = element_blank(),
        axis.ticks.y=element_blank(),
        panel.border = element_rect(fill=NA,color="grey80",
        size=1, linetype="solid"))+
  scale_size(range=c(1,5),guide=NULL)+
  guides(color=guide_colorbar(direction = "vertical",
  reverse = F,barwidth = unit(.6, "cm"),
  barheight = unit(10,"cm")))                        

绘制分组色条

group1 <- df %>% colnames() %>% as.data.frame() %>%
  data.frame(group= rep(LETTERS[1:2], times=c(5,5))) %>% 
  mutate(type="A") %>% 
  ggplot(aes(.,type,fill=group))+
  geom_tile()+
  scale_fill_manual(values=c("#00A08A","#78B7C5"))+
  scale_x_discrete(expand=c(0,0)) +
  scale_y_discrete(expand=c(0,0))+
  theme(axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        legend.title=element_blank())
group2 <- df %>% row.names() %>% as.data.frame() %>%
  data.frame(group= rep(LETTERS[1:4], times=c(5,5,5,5))) %>% 
  mutate(type="A") %>% 
  ggplot(aes(type,.,fill=group))+
  geom_tile()+
  scale_fill_manual(values=c("#00A08A","#78B7C5","#E6A0C4", "#C6CDF7"))+
  scale_x_discrete(expand=c(0,0)) +
  scale_y_discrete(expand=c(0,0))+
  theme(axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        legend.title=element_blank())

绘制聚类树

此处如果报错,请更新ggtree

phr <- hclust(dist(df)) %>% 
  ggtree(layout="rectangular", branch.length="none")

phc <- hclust(dist(t(df))) %>% ggtree() + layout_dendrogram()

aplot拼图

关于aplot的使用方法请参考以下文档 aplot详细文档

heatmap %>% insert_top(group1,height=0.03) %>%
  insert_left(group2,width=0.03) %>% 
  insert_left(phr, width=.1) %>%
  insert_top(phc, height=0.05)

喜欢的小伙伴欢迎关注我的公众号

R语言数据分析指南,持续分享数据可视化的经典案例及一些生信知识,希望对大家有所帮助

你可能感兴趣的:(ggplot2优雅的绘制热图)