【问题标题】:R heatmap.2 manual grouping of rows and columns [duplicate]R heatmap.2手动分组行和列[重复]
【发布时间】:2017-05-27 06:31:47
【问题描述】:

我有以下 MWE,我在其中制作了一个热图,而不执行任何聚类并显示任何树状图。我想以比现在更好看的方式将我的行(基因)按类别分组。

这是 MWE:

#MWE
library(gplots)
mymat <- matrix(rexp(600, rate=.1), ncol=12)
colnames(mymat) <- c(rep("treatment_1", 3), rep("treatment_2", 3), rep("treatment_3", 3), rep("treatment_4", 3))
rownames(mymat) <- paste("gene", 1:dim(mymat)[1], sep="_")
rownames(mymat) <- paste(rownames(mymat), c(rep("CATEGORY_1", 10), rep("CATEGORY_2", 10), rep("CATEGORY_3", 10), rep("CATEGORY_4", 10), rep("CATEGORY_5", 10)), sep=" --- ")
mymat #50x12 MATRIX. 50 GENES IN 5 CATEGORIES, ACROSS 4 TREATMENTS WITH 3 REPLICATES EACH
png(filename="TEST.png", height=800, width=600)
print(
heatmap.2(mymat, col=greenred(75),
      trace="none",
      keysize=1,
      margins=c(8,14),
      scale="row",
      dendrogram="none",
      Colv = FALSE,
      Rowv = FALSE,
      cexRow=0.5 + 1/log10(dim(mymat)[1]),
      cexCol=1.25,
      main="Genes grouped by categories")
)
dev.off()

产生这个:

我想将行中的 CATEGORIES 组合在一起(如果可能的话,列中的处理也是如此),所以它看起来像下面这样:

或者,也许更好,左边的类别,与执行聚类和显示树状图时的方式相同;但是更简单,更清晰......

有什么办法吗?谢谢!!

编辑!!

我了解到 cmets 中的 RowSideColors,并在下面制作了 MWE。但是,我似乎无法在输出 png 中打印图例,加上图例中的颜色不正确,我也无法正确定位。所以请帮助我了解下面 MWE 中的图例。

另一方面,我使用调色板“Set3”,由 12 种颜色组成,但如果我需要超过 12 种颜色(如果我有超过 12 个类别)怎么办??

新的 MWE

library(gplots)
library(RColorBrewer)
col1 <- brewer.pal(12, "Set3")
mymat <- matrix(rexp(600, rate=.1), ncol=12)
colnames(mymat) <- c(rep("treatment_1", 3), rep("treatment_2", 3), rep("treatment_3", 3), rep("treatment_4", 3))
rownames(mymat) <- paste("gene", 1:dim(mymat)[1], sep="_")
mymat
mydf <- data.frame(gene=paste("gene", 1:dim(mymat)[1], sep="_"), category=c(rep("CATEGORY_1", 10), rep("CATEGORY_2", 10), rep("CATEGORY_3", 10), rep("CATEGORY_4", 10), rep("CATEGORY_5", 10)))
mydf
png(filename="TEST.png", height=800, width=600)
print(
    heatmap.2(mymat, col=greenred(75),
              trace="none",
              keysize=1,
              margins=c(8,6),
              scale="row",
              dendrogram="none",
              Colv = FALSE,
              Rowv = FALSE,
              cexRow=0.5 + 1/log10(dim(mymat)[1]),
              cexCol=1.25,
              main="Genes grouped by categories",
              RowSideColors=col1[as.numeric(mydf$category)]
              )
    #THE LEGEND DOESN'T WORK INSIDE print(), AND THE POSITION AND COLORS ARE WRONG
    #legend("topright",
    #       legend = unique(mydf$category),
    #       col = col1[as.numeric(mydf$category)],
    #       lty= 1,
    #       lwd = 5,
    #       cex=.7
    #       )
)
dev.off()

产生:

请帮我解决传说,假设情况下我需要超过 12 种颜色。谢谢!

【问题讨论】:

  • 我会添加行和列侧颜色,例如 RowSideColors = as.character(factor(str_trim(unlist(lapply(str_split(rownames(mymat),"---"),"[",2))),labels = 1:5)) 操纵树状图使 IMO 毫无意义。
  • 是否可以为 RowSideColors 制作图例?如果您可以使用 RowSideColors 将您的评论发展为答案并为其添加图例,那将是一个完美的解决方案!
  • 我不太了解您评论中的代码,也无法使其正常工作,但是阅读了有关 RowSideColors 的信息,我带来了一个新的 MWE,并编辑了问题以包含它。快到了,求大神帮忙。谢谢!
  • yes @emilliman5 解决方案类似,但除此之外,我想将其打印成 png,而图例在这种情况下似乎不起作用......有什么建议吗?
  • 尝试删除print 命令,你不需要它。如果您遇到错误,请使用您收到的错误更新您的问题,以便我们帮助您进行诊断。

标签: r colors grouping legend heatmap


【解决方案1】:

我会使用 pheatmap 包。你的例子看起来像这样:

library(pheatmap)
library(RColorBrewer)

# Generte data (modified the mydf slightly)
col1 <- brewer.pal(12, "Set3")
mymat <- matrix(rexp(600, rate=.1), ncol=12)
colnames(mymat) <- c(rep("treatment_1", 3), rep("treatment_2", 3), rep("treatment_3", 3), rep("treatment_4", 3))
rownames(mymat) <- paste("gene", 1:dim(mymat)[1], sep="_")

mydf <- data.frame(row.names = paste("gene", 1:dim(mymat)[1], sep="_"), category = c(rep("CATEGORY_1", 10), rep("CATEGORY_2", 10), rep("CATEGORY_3", 10), rep("CATEGORY_4", 10), rep("CATEGORY_5", 10)))

# add row annotations
pheatmap(mymat, cluster_cols = F, cluster_rows = F, annotation_row = mydf)

# Add gaps
pheatmap(mymat, cluster_cols = F, cluster_rows = F, annotation_row = mydf, gaps_row = c(10, 20, 30, 40))

# Save to file with dimensions that keep both row and column names readable
pheatmap(mymat, cluster_cols = F, cluster_rows = F, annotation_row = mydf, gaps_row = c(10, 20, 30, 40), cellheight = 10, cellwidth = 20, file = "TEST.png") 

【讨论】:

  • 感谢您让我了解 pheatmap!它使事情变得更加简单,尤其是当它立即接受 hclust 和 dist 选项时(而不是必须在外面定义函数)。虽然问题是关于 heatmap.2,但我会接受这个答案。但是“cluster_rows=F, cluster_cols=F”对我不起作用,我需要写“FALSE”。此外,当我使用“filename =“TEST.png”保存png时如何防止R打开图形窗口??
  • 请您更新答案以防止图形窗口不断弹出,并能够更改类别颜色?非常感谢!
  • 我要为它开始一个新问题
  • 还有一个小问题(我可能会为此打开一个新页面):您知道是否可以进行聚类并按类别显示树状图?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多