有条件的热图

Heatmap with condition

我处理一些 rnaseq 数据,并且需要在确定的基因转录本处绘制带有点的热图。我不知道如何使用 ggpplot 或 pheatmap。所以我必须使用 inkscape 手动将每个点放在图上。这很累人,也很浪费时间。下面是来自 inkscape 的图像:

我用这段代码制作了基本情节:

pal <- colorRampPalette(c("blue","white","red"))
a<-pal(200)
my_sample_col <- data.frame(Condition = 
c("ALZxCon","PAxCon","PSPxCon"))
rownames(my_sample_col)<- colnames(transcript.table[,1:3])
my_colour <- list(Condition = c(ALZxCon = "lightblue",PAxCon = 
"pink",PSPxCon = "yellow"))

pheatmap(transcript.table[,1:3],annotation_col = 
my_sample_col,annotation_colors = my_colour[1],
color=a,show_colnames = F,cellheight = 15,cex=1,cluster_rows = 
F,cluster_cols = F,
fontsize_row = 10,gaps_col = c(1,2),cellwidth = 15)

成绩单 table 是这样的:

                         log2FC(AZ)  log2FC(PA)  log2FC(PSP)  Sig(AZ)  Sig(PA)  Sig(PSP)
ABCA7_ENST000002633094    -0.2        -0.3       -0.2         Not Sig  FDR<0.05  FDR<0.05
ABCA7_ENST0000043319      -0.6        -0.37      -0.7         FDR<0.05 FDR<0.05  FDR<0.05

我想生成一个热图,其中 FDR < 0.05 的转录本的正方形有一个黑点。你们可以帮忙吗?

我个人不是 pheatmap 等功能的忠实粉丝,正是因为您无法自定义您想要的每个细节。我将展示 ggplot2 的替代方案。

首先,ggplot 喜欢长格式的数据,我会这样做:

# Loading in your data
z <- "log2FC(AZ),log2FC(PA),log2FC(PSP),Sig(AZ),Sig(PA),Sig(PSP)
ABCA7_ENST000002633094,-0.2,-0.3,-0.2,Not Sig,FDR<0.05,FDR<0.05
ABCA7_ENST0000043319,-0.6,-0.37,-0.7,FDR<0.05,FDR<0.05,FDR<0.05"
tab <- read.table(text=z, header = T, sep = ",")

# Converting to long format
lfc <- tab[,1:3]
pval <- tab[,4:6]
colnames(lfc) <- colnames(pval) <- c("AZ", "PA", "PSP")

lfc  <- reshape2::melt(as.matrix(lfc))
pval <- reshape2::melt(as.matrix(pval))

df <- cbind(lfc, pval = pval$value)

这将为我们提供热图和重要点的主要成分,但我们需要一些额外的 data.frame 来进行一些注释:

anno <- data.frame(x = levels(df$Var2),
                   y = "Condition")

现在让这个注释与热图很好地工作的技巧是一个名为 ggnewscale 的包,它允许我们为热图设置连续填充和为注释设置离散填充。剩下的就是制作实际的情节,其中我试图在您的示例中保留 pheatmap 函数的某些方面。

library(ggnewscale)

ggplot(df, aes(Var2, Var1)) +
  # Important for ggnewscale is to specify a fill in the layer/geom itself
  geom_tile(aes(fill = value),
            width = 0.9, colour = "grey50") +
  geom_point(data = df[df$pval == "FDR<0.05",]) +
  scale_fill_gradientn(colours = c("blue", "white", "red"),
                       limits = c(-1,1)*max(abs(df$value)),
                       name = expression(atop("Log"[2]*" Fold","Change"))) +
  # Set new scale fill after you've specified the scale for the heatmap
  new_scale_fill() +
  geom_tile(data = anno, aes(x, y, fill = x),
            width = 0.9, height = 0.8, colour = "grey50") +
  scale_fill_discrete(name = "Condition") +
  scale_x_discrete(name = "", expand = c(0,0)) +
  scale_y_discrete(name = "", expand = c(0,0),
                   limits = c(levels(df$Var1), "Condition"),
                   position = "right") +
  coord_equal() +
  theme(panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_text(face = c(rep("plain", nlevels(df$Var1)), "bold")))

看起来像这样:

根据需要混合搭配 ggplot 代码。