Sylvain Mareschal
2013-Mar-12 16:44 UTC
[Rd] Request for more flexibility in heatmap() width / height ratio
Hi R users, I'm a quite extensive user of the heatmap() function, and as many others i'm frequently frustrated by its fixed square width / height ratio. Here is a typical example : dev.new() heatmap(matrix(rnorm(1200), nrow=10)) I have a non square matrix to plot with heatmap, as there are many more columns than rows, row labels are larger than necessary but column labels can't be read (this is quite common in transcriptomics, where there are many more genes than samples studied). With a classical plot, this could be fixed using a non square device area : dev.new(width=10, height=5) heatmap(matrix(rnorm(1200), nrow=10)) But as can be seen, heatmap don't make profit of it and leave empty room on each side. To get a readable figure, the user is requested to use a very large square device area (export to file becomes mandatory when the screen is not large enough), and thus to accommodate with very high rows and tiny columns. This flaw led several useRs to develop alternative functions in external packages : http://bioinformatics.mdanderson.org/Software/OOMPA/ClassDiscovery/html/aspectHeatmap.html http://hosho.ees.hokudai.ac.jp/~kubo/Rdoc/library/gplots/html/heatmap.2.html But after a quick look at the "stats" package sources, this seems quite easy to fix, without breaking backward compatibility : [ src/library/stats/R/dendrogram.R ] - line 689 : add "width=1" and "height=1" as arguments to heatmap() - line 768 : lwid <- c(if(doRdend) 1 else 0.05, 4) lwid <- c(if(doRdend) 1 else 0.05, width*4) - line 769 : lhei <- c((if(doCdend) 1 else 0.05) + if(!is.null(main)) 0.2 else 0, 4) lhei <- c((if(doCdend) 1 else 0.05) + if(!is.null(main)) 0.2 else 0, height*4) As the default values are 1, default behavior does not change and lead to square ratio. Changing "width" from 1 to 2 would lead to a figure with image() call roughly twice wider than high, and so on. Smarter default values could also be computed from the matrix size, e.g. : width = log(dim(x)[2] / dim(x)[1]) height = 1 As can be seen the two arguments could be replaced by a single "ratio" argument, as the function is using relative layout values ("width = 0.5 / height = 1" and "width = 1 / height = 2" have the same effect). So, is there a chance to see this behavior in a future R version or not ? Regards, Sylvain Mareschal [[alternative HTML version deleted]]
Prof Brian Ripley
2013-Mar-13 10:26 UTC
[Rd] Request for more flexibility in heatmap() width / height ratio
On 12/03/2013 16:44, Sylvain Mareschal wrote:> Hi R users, > > I'm a quite extensive user of the heatmap() function, and as many others > i'm frequently frustrated by its fixed square width / height ratio. Here is > a typical example : > > dev.new() > heatmap(matrix(rnorm(1200), nrow=10)) > > I have a non square matrix to plot with heatmap, as there are many more > columns than rows, row labels are larger than necessary but column labels > can't be read (this is quite common in transcriptomics, where there are > many more genes than samples studied). With a classical plot, this could be > fixed using a non square device area : > > dev.new(width=10, height=5) > heatmap(matrix(rnorm(1200), nrow=10)) > > But as can be seen, heatmap don't make profit of it and leave empty room on > each side. To get a readable figure, the user is requested to use a very > large square device area (export to file becomes mandatory when the screen > is not large enough), and thus to accommodate with very high rows and tiny > columns. > > This flaw led several useRs to develop alternative functions in external > packages : > http://bioinformatics.mdanderson.org/Software/OOMPA/ClassDiscovery/html/aspectHeatmap.html > http://hosho.ees.hokudai.ac.jp/~kubo/Rdoc/library/gplots/html/heatmap.2.html > > But after a quick look at the "stats" package sources, this seems quite > easy to fix, without breaking backward compatibility : > > > [ src/library/stats/R/dendrogram.R ] > > - line 689 : add "width=1" and "height=1" as arguments to heatmap() > - line 768 : lwid <- c(if(doRdend) 1 else 0.05, 4) > lwid <- c(if(doRdend) 1 else 0.05, width*4) > - line 769 : lhei <- c((if(doCdend) 1 else 0.05) + if(!is.null(main)) 0.2 > else 0, 4) > lhei <- c((if(doCdend) 1 else 0.05) + if(!is.null(main)) > 0.2 else 0, height*4) > > > As the default values are 1, default behavior does not change and lead to > square ratio. Changing "width" from 1 to 2 would lead to a figure with > image() call roughly twice wider than high, and so on. > > Smarter default values could also be computed from the matrix size, e.g. : > width = log(dim(x)[2] / dim(x)[1]) > height = 1 > > As can be seen the two arguments could be replaced by a single "ratio" > argument, as the function is using relative layout values ("width = 0.5 / > height = 1" and "width = 1 / height = 2" have the same effect). > > > So, is there a chance to see this behavior in a future R version or not ?Yes. Submit it as a wishlist item at bugs.r-project.org with patches to both the R sources and the help page (patches should be against the development version of R). An example would be needed, as part of the report or the enhanced help page.> > > Regards, > Sylvain Mareschal > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595