[R] grid.legend - lines

Paul Murrell p.murrell at auckland.ac.nz
Thu Sep 26 04:18:48 CEST 2002


Hi


Morten Sickel wrote:
> 
> I am testing out the grid-plots, but get into a problem making a legend. I
> have a line plot and some points, following the model in
> grid.plot.and.legend() i manage to get the points correctly in the legend,
> but what do I do with the line? (Of cource, I can just draw a line at the
> right location on the plot, but I would prefer to use legend)


Apologies for the very late reply (it's a busy teaching time:().

I'm afraid the grid.legend() function is only a little bit less of a
how-to demonstration than the grid.plot.and.legend() function.  However,
it is fairly straightforward to add line types to it.  The code below
defines a grid.legend2() function that allows you to specify lty as well
as pch.  Here are a couple of simple demonstrations of how it could be
used ...

grid.legend2(1:3, 1:3, 1:3)
grid.newpage()
grid.legend2(lty=1:3, labels=1:3)

... there is also a grid.plot.and.legend2() function given below which
does the same thing as grid.plot.and.legend(), but draws a legend using
lty instead of pch.  I hope this is of some help.  Please get back to me
if any of this is not clear.

Paul


############

grid.legend2 <- function (pch=NULL, lty=NULL,
                          labels, frame = TRUE,
                          hgap = unit(0.5, "lines"), 
                          vgap = unit(0.5, "lines"),
                          default.units = "lines",
                          gp = gpar(), 
                          draw = TRUE, vp = NULL) 
{
  labels <- as.character(labels)
  nkeys <- length(labels)
  if (!is.unit(hgap)) 
    hgap <- unit(hgap, default.units)
  if (length(hgap) != 1) 
    stop("hgap must be single unit")
  if (!is.unit(vgap)) 
    vgap <- unit(vgap, default.units)
  if (length(vgap) != 1) 
    stop("vgap must be single unit")
  legend.layout <-
    grid.layout(nkeys, 3,
                widths = unit.c(unit(2, "lines"),
                  max(unit(rep(1, nkeys), "strwidth",
                           as.list(labels))), 
                  hgap),
                heights = unit.pmax(unit(2, "lines"),
                  vgap + unit(rep(1, nkeys), "strheight",
                              as.list(labels))))
  gf <- grid.frame(layout = legend.layout, vp = vp, gp = gp, 
                   draw = FALSE)
  for (i in 1:nkeys) {
    if (!is.null(pch))
      grid.place(gf, grid.points(0.5, 0.5, pch = pch[i],
                                 draw = FALSE), 
                 col = 1, row = i, draw = FALSE)
    if (!is.null(lty))
      grid.place(gf, grid.lines(x=c(0.2, 0.8), y=0.5,
                                gp=gpar(lty=lty[i]),
                                draw=FALSE),
                 col = 1, row = i, draw=FALSE)
    grid.place(gf, grid.text(labels[i], x = 0, y = 0.5,
                             just = c("left", "centre"),
                             draw = FALSE),
               col = 2, row = i, draw = FALSE)
  }
  if (draw) 
    grid.draw(gf)
  gf
}

grid.plot.and.legend2 <- function () 
{
  grid.newpage()
  top.vp <- viewport(w = 0.8, h = 0.8)
  push.viewport(top.vp)
  x <- runif(10)
  y1 <- runif(10)
  y2 <- runif(10)
  lty <- 1:3
  labels <- c("Girls", "Boys", "Other")
  lf <- grid.frame(draw = TRUE)
  plot <- grid.collection(grid.rect(draw = FALSE),
                          grid.lines(x, y1, gp=gpar(lty = 1),
                                     draw = FALSE),
                          grid.lines(x, y2, gp=gpar(lty=2),
                                     draw = FALSE),
                          grid.xaxis(draw = FALSE), grid.yaxis(
                                       draw = FALSE), 
                          draw = FALSE)
  grid.pack(lf, plot)
  grid.pack(lf, grid.legend2(NULL, lty, labels, draw = FALSE),
            height = unit(1, "null"), side = "right")
  grid.draw(lf)
}
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list