From ripley at stats.ox.ac.uk  Wed Mar 13 11:26:18 2013
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Wed, 13 Mar 2013 10:26:18 +0000
Subject: [Rd] Request for more flexibility in heatmap() width / height
 ratio
In-Reply-To: <CAMug1mTpDZKnogHuN8OFaqPrRePgdDJmKZAC+22oH92J52MWSw@mail.gmail.com>
References: <CAMug1mTpDZKnogHuN8OFaqPrRePgdDJmKZAC+22oH92J52MWSw@mail.gmail.com>
Message-ID: <5140544A.6010508@stats.ox.ac.uk>

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



[Rd] Request for more flexibility in heatmap() width / height ratio
Prof Brian Ripley