[Rd] barplot can put legend in wrong place, request option to override that (PR#13265)

timhesterberg at gmail.com timhesterberg at gmail.com
Fri Nov 7 22:35:12 CET 2008


This in an enhancement requestion, to add the capability to pass
arguments through barplot() to legend().  I've created a version that
does this.

# Run this code; notice that the legend
# is superposed over one bar:
barplot(height =
        cbind(x = c(465,91) / 465 * 100,
              y = c(840,200) / 840 * 100,
              z = c(37,17) / 37 * 100),
        beside = FALSE,
        width = c(465, 840, 37),
        col = c(1, 2),
        legend.text = c("A", "B"))

# It would be nice to move the legend to
# the top left, where there is room.
# barplot() doesn't support this.
# Below are diffs for a patched
# version that adds an 'args.legend' argument, e.g.
barplot(height =
        cbind(x = c(465,91) / 465 * 100,
              y = c(840,200) / 840 * 100,
              z = c(37,17) / 37 * 100),
        beside = FALSE,
        width = c(465, 840, 37),
        col = c(1, 2),
        legend.text = c("A", "B"),
        args.legend = list(x = "topleft"))

# Check that some of the other arguments are passed without conflict:
barplot(height =
        cbind(x = c(465,91) / 465 * 100,
              y = c(840,200) / 840 * 100,
              z = c(37,17) / 37 * 100),
        beside = FALSE,
        width = c(465, 840, 37),
        col = c(1, 2),
        legend.text = c("A", "B"),
        args.legend = list(x = 35, y=140, xjust=0, yjust=.5, lty=2))


$ diff -c barplot.R barplot2.R
*** barplot.R    Mon Aug 11 02:51:52 2008
--- barplot2.R    Fri Nov  7 11:52:00 2008
***************
*** 25,31 ****
       xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
       axes = TRUE, axisnames = TRUE,
       cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
!      inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0, add = FALSE,
...)
  {
      if (!missing(inside)) .NotYetUsed("inside", error = FALSE)# -> help(.)

--- 25,32 ----
       xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
       axes = TRUE, axisnames = TRUE,
       cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
!      inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0, add = FALSE,
!          args.legend = NULL, ...)
  {
      if (!missing(inside)) .NotYetUsed("inside", error = FALSE)# -> help(.)

***************
*** 176,184 ****
          angle <- rev(angle)
          }
          xy <- par("usr")
!         legend(xy[2] - xinch(0.1), xy[4] - yinch(0.1),
!            legend = legend.text, angle = angle, density = density,
!            fill = legend.col, xjust = 1, yjust = 1)
      }
      title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...)
      if(axes) axis(if(horiz) 1 else 2, cex.axis = cex.axis, ...)
--- 177,197 ----
          angle <- rev(angle)
          }
          xy <- par("usr")
!             if(is.null(args.legend)) {
!               legend(xy[2] - xinch(0.1), xy[4] - yinch(0.1),
!                      legend = legend.text, angle = angle, density =
density,
!                      fill = legend.col, xjust = 1, yjust = 1)
!             } else {
!               args.legend1 <- list(x = xy[2] - xinch(0.1),
!                                    y = xy[4] - yinch(0.1),
!                                    legend = legend.text,
!                                    angle = angle,
!                                    density = density,
!                                    fill = legend.col,
!                                    xjust = 1, yjust = 1)
!               args.legend1[names(args.legend)] <- args.legend
!               do.call("legend", args.legend1)
!             }
      }
      title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...)
      if(axes) axis(if(horiz) 1 else 2, cex.axis = cex.axis, ...)
$ diff -c barplot.Rd barplot2.Rd
*** barplot.Rd    Mon Sep 24 19:05:10 2007
--- barplot2.Rd    Fri Nov  7 13:22:22 2008
***************
*** 22,28 ****
          axes = TRUE, axisnames = TRUE,
          cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
          inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
!         add = FALSE, \dots)
  }
  \arguments{
    \item{height}{either a vector or matrix of values describing the
--- 22,28 ----
          axes = TRUE, axisnames = TRUE,
          cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
          inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
!         add = FALSE, args.legend = NULL, \dots)
  }
  \arguments{
    \item{height}{either a vector or matrix of values describing the
***************
*** 105,110 ****
--- 105,113 ----
      relative to the x axis.}
    \item{add}{logical specifying if bars should be added to an already
      existing plot; defaults to \code{FALSE}.}
+   \item{args.legend}{list of additional arguments to pass to
+     \code{\link{legend()}}; names of the list are used as argument
+     names.  Only used if \code{legend.text} is supplied.}
    \item{\dots}{arguments to be passed to/from other methods.  For the
      default method these can include further arguments (such as
      \code{axes}, \code{asp} and \code{main}) and graphical
rocket at rocket1:~/R/bugs/barplot$



--please do not edit the information below--

Version:
 platform = i386-apple-darwin8.11.1
 arch = i386
 os = darwin8.11.1
 system = i386, darwin8.11.1
 status =
 major = 2
 minor = 8.0
 year = 2008
 month = 10
 day = 20
 svn rev = 46754
 language = R
 version.string = R version 2.8.0 (2008-10-20)

Locale:
C

Search Path:
 .GlobalEnv, package:stats, package:graphics, package:grDevices,
package:utils, package:datasets, package:methods, Autoloads, package:base

	[[alternative HTML version deleted]]



More information about the R-devel mailing list