[Rd] boxplot and bxp do not respect xlim by default (PR#9754)

s.ellison at lgc.co.uk s.ellison at lgc.co.uk
Tue Jun 26 14:16:53 CEST 2007

Full_Name: Steve Ellison
Version: 2.4.1
OS: Windows, Linux
Submission from: (NULL) (

bxp() allows specifcation of box locations with at=, but neither adjusts xlim=
to fit at nor does it respect xlim provided explicitly.

This is because bxp() now includes explicit xlim as c(0.5, n+0.5), without
checking for explicitly supplied xlim (or ylim if horizontal).

This also prevents simple added plots (eg if add=T, with at=(1:n)+0.5, the last
box is partly off the plot.

The 'offending' code is in bxp:
    if (!add) {
        if (horizontal) 
            plot.window(ylim = c(0.5, n + 0.5), xlim = ylim, 
                log = log, xaxs = pars$yaxs)
        else plot.window(xlim = c(0.5, n + 0.5), ylim = ylim, 
            log = log, yaxs = pars$yaxs)

Suggested fix:
   if (!add) {
	bxp.limits <- if(!is.null(at)) {
              c(at[1]-(at[2]-at[1])/2, at[n]+(at[n]-at[n-1])/2 ) 
           } else {
              c(0.5, n + 0.5)
        if (horizontal) 
            plot.window(ylim = if(is.null(pars$xlim)) bxp.limits else
                      xlim = ylim, log = log, xaxs = pars$yaxs)
        else plot.window(xlim = if(is.null(pars$xlim)) bxp.limits else
                      ylim = ylim, log = log, yaxs = pars$yaxs)

This retains the current defaults for xlim with at unspecified but allows
explicit specification of xlim. (which is the grouping level axis whether
horizontal or vertical).

I've tested the above as far as producing a modified bxp and plotting a boxplot
object, but have not tried calling direct from boxplot. boxplot() should,
however, not need modification as xlim and ylim are, I believe, passed via the
namedargs list in the bxp call.

More information about the R-devel mailing list