R pheatmap: change annotation colors and prevent graphics window from popping up

混江龙づ霸主 提交于 2019-11-29 14:43:34

问题


Following up on this question, I found the pheatmap function (which offers me a lot more control on the stuff that I want to do than heatmap.2).

I have 2 problems though:

1- I cannot change the colors of the annotation (categories)

2- The graphics window keeps popping up even when I am saving the output in a png file

This is my MWE:

library(pheatmap)
library(RColorBrewer)
cols <- colorRampPalette(brewer.pal(9, "Set1"))

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="_")

annotdf <- 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)))

mycolors <- cols(length(unique(annotdf$category)))
names(mycolors) <- unique(annotdf$category)
mycolors <- list(mycolors = mycolors)

pheatmap(mymat,
     color=greenred(75),
     scale="row",
     cluster_rows = FALSE,
     cluster_cols = FALSE,
     gaps_row=c(10,20,30,40),
     gaps_col=c(3,6,9),
     cellheight = 6,
     cellwidth = 20,
     border_color=NA,
     fontsize_row = 6,
     main="Genes grouped by categories",
     filename = "TEST.png",
     annotation_row = annotdf,
     annotation_colors = mycolors
)

Which produces:

As you can see, the colors are clearly NOT the Set1 palette I specify, but the default pheatmap colors (you will get the same results removing the annotation_colors line).

So my question here is: How do I specify annotation_colors in pheatmap??

On the other hand, even when I am saving the pheatmap output in a png file, the graphics window keeps popping up, how do I prevent this from happening?

Thanks!

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.1 LTS

locale:
 [1] LC_CTYPE=en_SG.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_SG.UTF-8        LC_COLLATE=en_SG.UTF-8    
 [5] LC_MONETARY=en_SG.UTF-8    LC_MESSAGES=en_SG.UTF-8   
 [7] LC_PAPER=en_SG.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_SG.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] gplots_3.0.1       RColorBrewer_1.1-2 pheatmap_1.0.8    

loaded via a namespace (and not attached):
 [1] compiler_3.3.1     colorspace_1.2-6   scales_0.4.0       plyr_1.8.3        
 [5] tools_3.3.1        gtable_0.2.0       Rcpp_0.12.7        KernSmooth_2.23-15
 [9] gdata_2.17.0       grid_3.3.1         caTools_1.17.1     bitops_1.0-6      
[13] munsell_0.4.3      gtools_3.5.0

回答1:


  1. To get more colors for more categories you will need to use a different color palette. There are many continuous palettes that will allow you to go well beyond 12 (like with RColorBrewer).

  2. If you are running the code in your MWE as is, the R graphics window should not be popping up. I ran your example and it produced the desired file with out opening a graphics device to the console. Below is my sessioInfo() if you would like to compare. I would try closing all devices (dev.off(), until you get a warning that you cannot close the null device) and then running your heatmap code to see if that solves the problem. I would also check to make sure you have write privileges in the directory you are currently working in???

  3. As @cuttlefish stated in his comment to get the custom Row/Col colors to display the names in the list of colors has to mach the colnames of your annotation dataframe.

For more than 12 colors

mymat <- matrix(rexp(720, 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="_")

annotdf <- data.frame(row.names = rownames(mymat), 
                      category = rep(paste0("Category_", seq(12)), each=5) )  

newCols <- colorRampPalette(grDevices::rainbow(length(unique(annotdf$category))))
mycolors <- newCols(length(unique(annotdf$category)))
names(mycolors) <- unique(annotdf$category)
mycolors <- list(category = mycolors)

pheatmap(mymat,
         color=greenred(75),
         scale="row",
         cluster_rows = FALSE,
         cluster_cols = FALSE,
         gaps_row=c(5,10,15,20,25,30,35,40,45,50, 55),
         gaps_col=c(3,6,9),
         cellheight = 6,
         cellwidth = 20,
         border_color=NA,
         fontsize_row = 6,
         main="Genes grouped by categories",
         filename = "TEST_12cat.png",
         annotation_row = annotdf,
         annotation_colors = mycolors
)

SessionInfo

R version 3.3.0 (2016-05-03)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.6 (El Capitan)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] pheatmap_1.0.8     RColorBrewer_1.1-2 gplots_3.0.1      

loaded via a namespace (and not attached):
 [1] colorspace_1.3-0   scales_0.4.1       colorRamps_2.3     plyr_1.8.4         tools_3.3.0       
 [6] gtable_0.2.0       Rcpp_0.12.7        KernSmooth_2.23-15 gdata_2.17.0       grid_3.3.0        
[11] caTools_1.17.1     munsell_0.4.3      bitops_1.0-6       gtools_3.5.0    


来源:https://stackoverflow.com/questions/41628450/r-pheatmap-change-annotation-colors-and-prevent-graphics-window-from-popping-up

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!