
R Under development (unstable) (2022-03-19 r81942) -- "Unsuffered Consequences"
Copyright (C) 2022 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> pkgname <- "grid"
> source(file.path(R.home("share"), "R", "examples-header.R"))
> options(warn = 1)
> library('grid')
> 
> base::assign(".oldSearch", base::search(), pos = 'CheckExEnv')
> base::assign(".old_wd", base::getwd(), pos = 'CheckExEnv')
> cleanEx()
> nameEx("Grid")
> ### * Grid
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: Grid
> ### Title: Grid Graphics
> ### Aliases: Grid
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## Diagram of a simple layout
> grid.show.layout(grid.layout(4,2,
+                      heights=unit(rep(1, 4),
+                                   c("lines", "lines", "lines", "null")),
+                      widths=unit(c(1, 1), "inches")))
> ## Diagram of a sample viewport
> grid.show.viewport(viewport(x=0.6, y=0.6,
+                             width=unit(1, "inches"), height=unit(1, "inches")))
> ## A flash plotting example
> grid.multipanel(vp=viewport(0.5, 0.5, 0.8, 0.8))
> 
> 
> 
> cleanEx()
> nameEx("arrow")
> ### * arrow
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: arrow
> ### Title: Describe arrows to add to a line.
> ### Aliases: arrow
> ### Keywords: dplot
> 
> ### ** Examples
> 
> arrow()
$angle
[1] 30

$length
[1] 0.25inches

$ends
[1] 2

$type
[1] 1

attr(,"class")
[1] "arrow"
> 
> 
> 
> cleanEx()
> nameEx("as.mask")
> ### * as.mask
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: as.mask
> ### Title: Define a Soft Mask
> ### Aliases: as.mask
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## NOTE: on devices without support for masks normal line segments 
> ##       will be drawn
> grid.newpage()
> ## Alpha mask
> grid.segments(y0=1, y1=0, gp=gpar(col=2, lwd=100))
> pushViewport(viewport(mask=circleGrob(gp=gpar(fill=rgb(0,0,0,.5)))))
> grid.segments(gp=gpar(col=3, lwd=100))
> grid.newpage()
> ## Luminance mask
> grid.segments(y0=1, y1=0, gp=gpar(col=2, lwd=100))
> pushViewport(viewport(mask=as.mask(circleGrob(gp=gpar(fill="grey50")),
+                                    "luminance")))
> grid.segments(gp=gpar(col=3, lwd=100))
> 
> 
> 
> cleanEx()
> nameEx("calcStringMetric")
> ### * calcStringMetric
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: calcStringMetric
> ### Title: Calculate Metric Information for Text
> ### Aliases: calcStringMetric
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> grid.segments(.01, .5, .99, .5, gp=gpar(col="grey"))
> metrics <- calcStringMetric(letters)
> grid.rect(x=1:26/27,
+           width=unit(metrics$width, "inches"),
+           height=unit(metrics$ascent, "inches"),
+           just="bottom",
+           gp=gpar(col="red"))
> grid.rect(x=1:26/27,
+           width=unit(metrics$width, "inches"),
+           height=unit(metrics$descent, "inches"),
+           just="top",
+           gp=gpar(col="red"))
> grid.text(letters, x=1:26/27, just="bottom")
> 
> test <- function(x) {
+     grid.text(x, just="bottom")
+     metric <- calcStringMetric(x)
+     if (is.character(x)) {
+         grid.rect(width=unit(metric$width, "inches"),
+                   height=unit(metric$ascent, "inches"),
+                   just="bottom",
+                   gp=gpar(col=rgb(1,0,0,.5)))
+         grid.rect(width=unit(metric$width, "inches"),
+                   height=unit(metric$descent, "inches"),
+                   just="top",
+                   gp=gpar(col=rgb(1,0,0,.5)))
+     } else {
+         grid.rect(width=unit(metric$width, "inches"),
+                   y=unit(.5, "npc") + unit(metric[2], "inches"),
+                   height=unit(metric$ascent, "inches"),
+                   just="bottom",
+                   gp=gpar(col=rgb(1,0,0,.5)))
+         grid.rect(width=unit(metric$width, "inches"),
+                   height=unit(metric$descent, "inches"),
+                   just="bottom",
+                   gp=gpar(col=rgb(1,0,0,.5)))
+     }
+ }
> 
> tests <- list("t",
+               "test",
+               "testy",
+               "test\ntwo",
+               expression(x),
+               expression(y),
+               expression(x + y),
+               expression(a + b),
+               expression(atop(x + y, 2)))
> 
> grid.newpage()
> nrowcol <- n2mfrow(length(tests))
> pushViewport(viewport(layout=grid.layout(nrowcol[1], nrowcol[2]),
+                       gp=gpar(cex=5, lwd=.5)))
> for (i in 1:length(tests)) {
+     col <- (i - 1) %% nrowcol[2] + 1
+     row <- (i - 1) %/% nrowcol[2] + 1
+     pushViewport(viewport(layout.pos.row=row, layout.pos.col=col))
+     test(tests[[i]])
+     popViewport()
+ }
> 
> 
> 
> 
> cleanEx()
> nameEx("current.viewport")
> ### * current.viewport
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: Querying the Viewport Tree
> ### Title: Get the Current Grid Viewport (Tree)
> ### Aliases: current.viewport current.parent current.vpTree current.vpPath
> ###   current.transform current.rotation
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> pushViewport(viewport(width=0.8, height=0.8, name="A"))
> pushViewport(viewport(x=0.1, width=0.3, height=0.6,
+   just="left", name="B"))
> upViewport(1)
> pushViewport(viewport(x=0.5, width=0.4, height=0.8,
+   just="left", name="C"))
> pushViewport(viewport(width=0.8, height=0.8, name="D"))
> current.vpPath()
GRID.VP.69::A::C::D 
> upViewport(1)
> current.vpPath()
GRID.VP.69::A::C 
> current.vpTree()
viewport[ROOT]->(viewport[GRID.VP.69]->(viewport[A]->(viewport[B], viewport[C]->(viewport[D])))) 
> current.viewport()
viewport[C] 
> current.vpTree(all=FALSE)
viewport[C]->(viewport[D]) 
> popViewport(0)
> 
> 
> 
> cleanEx()
> nameEx("depth")
> ### * depth
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: depth
> ### Title: Determine the number of levels in an object.
> ### Aliases: depth depth.viewport depth.path
> ### Keywords: dplot
> 
> ### ** Examples
> 
> vp <- viewport()
> depth(vp)
[1] 1
> depth(vpStack(vp, vp))
[1] 2
> depth(vpList(vpStack(vp, vp), vp))
[1] 1
> depth(vpPath("vp"))
[1] 1
> depth(vpPath("vp1", "vp2"))
[1] 2
> 
> 
> 
> cleanEx()
> nameEx("deviceLoc")
> ### * deviceLoc
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: deviceLoc
> ### Title: Convert Viewport Location to Device Location
> ### Aliases: deviceLoc deviceDim
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## A tautology
> grid.newpage()
> pushViewport(viewport())
> deviceLoc(unit(1, "inches"), unit(1, "inches"))
$x
[1] 1inches

$y
[1] 1inches

> 
> ## Something less obvious
> grid.newpage()
> pushViewport(viewport(width=.5, height=.5))
> grid.rect()
> x <- unit(1, "in")
> y <- unit(1, "in")
> grid.circle(x, y, r=unit(2, "mm"))
> loc <- deviceLoc(x, y)
> loc
$x
[1] 2.7inches

$y
[1] 2.75inches

> upViewport()
> grid.circle(loc$x, loc$y, r=unit(1, "mm"), gp=gpar(fill="black"))
> 
> ## Something even less obvious
> grid.newpage()
> pushViewport(viewport(width=.5, height=.5, angle=30))
> grid.rect()
> x <- unit(.2, "npc")
> y <- unit(2, "in")
> grid.circle(x, y, r=unit(2, "mm"))
> loc <- deviceLoc(x, y)
> loc
$x
[1] 2.39165408813987inches

$y
[1] 3.20650635094611inches

> upViewport()
> grid.circle(loc$x, loc$y, r=unit(1, "mm"), gp=gpar(fill="black"))
> 
> 
> 
> cleanEx()
> nameEx("explode")
> ### * explode
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: explode
> ### Title: Explode a path into its components.
> ### Aliases: explode explode.character explode.path
> ### Keywords: dplot
> 
> ### ** Examples
> 
> explode("vp1::vp2")
[1] "vp1" "vp2"
> explode(vpPath("vp1", "vp2"))
[1] "vp1" "vp2"
> 
> 
> 
> cleanEx()
> nameEx("gEdit")
> ### * gEdit
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: gEdit
> ### Title: Create and Apply Edit Objects
> ### Aliases: gEdit gEditList applyEdit applyEdits
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.rect(gp=gpar(col="red"))
> # same thing, but more verbose
> grid.draw(applyEdit(rectGrob(), gEdit(gp=gpar(col="red"))))
> 
> 
> 
> cleanEx()
> nameEx("gPath")
> ### * gPath
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: gPath
> ### Title: Concatenate Grob Names
> ### Aliases: gPath
> ### Keywords: dplot
> 
> ### ** Examples
> 
> gPath("g1", "g2")
g1::g2 
> 
> 
> 
> cleanEx()
> nameEx("getNames")
> ### * getNames
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: getNames
> ### Title: List the names of grobs on the display list
> ### Aliases: getNames
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.grill()
> getNames()
[1] "GRID.text.179"     "GRID.rect.180"     "GRID.circle.181"  
[4] "GRID.circle.182"   "GRID.rect.183"     "GRID.rect.184"    
[7] "GRID.segments.185" "GRID.segments.186"
> 
> 
> 
> cleanEx()
> nameEx("gpar")
> ### * gpar
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: gpar
> ### Title: Handling Grid Graphical Parameters
> ### Aliases: gpar get.gpar
> ### Keywords: dplot
> 
> ### ** Examples
> 
> gp <- get.gpar()
> utils::str(gp)
List of 14
 $ fill      : chr "transparent"
 $ col       : chr "black"
 $ lty       : chr "solid"
 $ lwd       : num 1
 $ cex       : num 1
 $ fontsize  : num 12
 $ lineheight: num 1.2
 $ font      : int 1
 $ fontfamily: chr ""
 $ alpha     : num 1
 $ lineend   : chr "round"
 $ linejoin  : chr "round"
 $ linemitre : num 10
 $ lex       : num 1
 - attr(*, "class")= chr "gpar"
> ## These *do* nothing but produce a "gpar" object:
> gpar(col = "red")
$col
[1] "red"

> gpar(col = "blue", lty = "solid", lwd = 3, fontsize = 16)
$col
[1] "blue"

$lty
[1] "solid"

$lwd
[1] 3

$fontsize
[1] 16

> get.gpar(c("col", "lty"))
$col
[1] "black"

$lty
[1] "solid"

> grid.newpage()
> vp <- viewport(width = .8, height = .8, gp = gpar(col="blue"))
> grid.draw(gTree(children=gList(rectGrob(gp = gpar(col="red")),
+                      textGrob(paste("The rect is its own colour (red)",
+                                     "but this text is the colour",
+                                     "set by the gTree (green)",
+                                     sep = "\n"))),
+       gp = gpar(col="green"), vp = vp))
> grid.text("This text is the colour set by the viewport (blue)",
+           y = 1, just = c("center", "bottom"),
+           gp = gpar(fontsize=20), vp = vp)
> grid.newpage()
> ## example with multiple values for a parameter
> pushViewport(viewport())
> grid.points(1:10/11, 1:10/11, gp = gpar(col=1:10))
> popViewport()
> 
> 
> 
> cleanEx()
> nameEx("grid.DLapply")
> ### * grid.DLapply
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.DLapply
> ### Title: Modify the Grid Display List
> ### Aliases: grid.DLapply
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> grid.rect(width=.4, height=.4, x=.25, y=.75, gp=gpar(fill="black"), name="r1")
> grid.rect(width=.4, height=.4, x=.5, y=.5, gp=gpar(fill="grey"), name="r2")
> grid.rect(width=.4, height=.4, x=.75, y=.25, gp=gpar(fill="white"), name="r3")
> grid.DLapply(function(x) { if (is.grob(x)) x$gp <- gpar(); x })
NULL
> grid.refresh()
> 
> 
> 
> cleanEx()
> nameEx("grid.bezier")
> ### * grid.bezier
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.bezier
> ### Title: Draw a Bezier Curve
> ### Aliases: grid.bezier bezierGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> x <- c(0.2, 0.2, 0.4, 0.4)
> y <- c(0.2, 0.4, 0.4, 0.2)
> 
> grid.newpage()
> grid.bezier(x, y)
> grid.bezier(c(x, x + .4), c(y + .4, y + .4),
+             id=rep(1:2, each=4))
> grid.segments(.4, .6, .6, .6)
> grid.bezier(x, y,
+             gp=gpar(lwd=3, fill="black"),
+             arrow=arrow(type="closed"),
+             vp=viewport(x=.9))
> 
> 
> 
> cleanEx()
> nameEx("grid.cap")
> ### * grid.cap
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.cap
> ### Title: Capture a raster image
> ### Aliases: grid.cap
> ### Keywords: dplot
> 
> ### ** Examples
> 
> 
> 
> 
> cleanEx()
> nameEx("grid.clip")
> ### * grid.clip
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.clip
> ### Title: Set the Clipping Region
> ### Aliases: grid.clip clipGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> # draw across entire viewport, but clipped
> grid.clip(x = 0.3, width = 0.1)
> grid.lines(gp=gpar(col="green", lwd=5))
> # draw across entire viewport, but clipped (in different place)
> grid.clip(x = 0.7, width = 0.1)
> grid.lines(gp=gpar(col="red", lwd=5))
> # Viewport sets new clip region
> pushViewport(viewport(width=0.5, height=0.5, clip=TRUE))
> grid.lines(gp=gpar(col="grey", lwd=3))
> # Return to original viewport;  get
> # clip region from previous grid.clip()
> # (NOT from previous viewport clip region)
> popViewport()
> grid.lines(gp=gpar(col="black"))
> 
> 
> 
> cleanEx()
> nameEx("grid.convert")
> ### * grid.convert
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.convert
> ### Title: Convert Between Different grid Coordinate Systems
> ### Aliases: convertUnit convertX convertY convertWidth convertHeight
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## A tautology
> convertX(unit(1, "inches"), "inches")
[1] 1inches
> ## The physical units
> convertX(unit(2.54, "cm"), "inches")
[1] 1inches
> convertX(unit(25.4, "mm"), "inches")
[1] 1inches
> convertX(unit(72.27, "points"), "inches")
[1] 1inches
> convertX(unit(1/12*72.27, "picas"), "inches")
[1] 1inches
> convertX(unit(72, "bigpts"), "inches")
[1] 1inches
> convertX(unit(1157/1238*72.27, "dida"), "inches")
[1] 1inches
> convertX(unit(1/12*1157/1238*72.27, "cicero"), "inches")
[1] 1inches
> convertX(unit(65536*72.27, "scaledpts"), "inches")
[1] 1inches
> convertX(unit(1/2.54, "inches"), "cm")
[1] 1cm
> convertX(unit(1/25.4, "inches"), "mm")
[1] 1mm
> convertX(unit(1/72.27, "inches"), "points")
[1] 1points
> convertX(unit(1/(1/12*72.27), "inches"), "picas")
[1] 1picas
> convertX(unit(1/72, "inches"), "bigpts")
[1] 1bigpts
> convertX(unit(1/(1157/1238*72.27), "inches"), "dida")
[1] 1dida
> convertX(unit(1/(1/12*1157/1238*72.27), "inches"), "cicero")
[1] 1cicero
> convertX(unit(1/(65536*72.27), "inches"), "scaledpts")
[1] 1scaledpts
> 
> pushViewport(viewport(width=unit(1, "inches"),
+                        height=unit(2, "inches"),
+                        xscale=c(0, 1),
+                        yscale=c(1, 3)))
>   ## Location versus dimension
>   convertY(unit(2, "native"), "inches")
[1] 1inches
>   convertHeight(unit(2, "native"), "inches")
[1] 2inches
>   ## From "x" to "y" (the conversion is via "inches")
>   convertUnit(unit(1, "native"), "native",
+                axisFrom="x", axisTo="y")
[1] 2native
>   ## Convert several values at once
>   convertX(unit(c(0.5, 2.54), c("npc", "cm")),
+                 c("inches", "native"))
[1] 0.5inches 1native  
> popViewport()
> ## Convert a complex unit
> convertX(unit(1, "strwidth", "Hello"), "native")
[1] 0.0558333333333333native
> 
> 
> 
> cleanEx()
> nameEx("grid.curve")
> ### * grid.curve
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.curve
> ### Title: Draw a Curve Between Locations
> ### Aliases: grid.curve curveGrob arcCurvature
> ### Keywords: dplot
> 
> ### ** Examples
> 
> curveTest <- function(i, j, ...) {
+   pushViewport(viewport(layout.pos.col=j, layout.pos.row=i))
+   do.call("grid.curve", c(list(x1=.25, y1=.25, x2=.75, y2=.75), list(...)))
+   grid.text(sub("list\\((.*)\\)", "\\1",
+                 deparse(substitute(list(...)))),
+             y=unit(1, "npc"))
+   popViewport()
+ }
> # grid.newpage()
> pushViewport(plotViewport(c(0, 0, 1, 0),
+                           layout=grid.layout(2, 1, heights=c(2, 1))))
> pushViewport(viewport(layout.pos.row=1,
+                       layout=grid.layout(3, 3, respect=TRUE)))
> curveTest(1, 1)
> curveTest(1, 2, inflect=TRUE)
> curveTest(1, 3, angle=135)
> curveTest(2, 1, arrow=arrow())
> curveTest(2, 2, ncp=8)
> curveTest(2, 3, shape=0)
> curveTest(3, 1, curvature=-1)
> curveTest(3, 2, square=FALSE)
> curveTest(3, 3, debug=TRUE)
> popViewport()
> pushViewport(viewport(layout.pos.row=2,
+                       layout=grid.layout(3, 3)))
> curveTest(1, 1)
> curveTest(1, 2, inflect=TRUE)
> curveTest(1, 3, angle=135)
> curveTest(2, 1, arrow=arrow())
> curveTest(2, 2, ncp=8)
> curveTest(2, 3, shape=0)
> curveTest(3, 1, curvature=-1)
> curveTest(3, 2, square=FALSE)
> curveTest(3, 3, debug=TRUE)
> popViewport(2)
> 
> 
> 
> cleanEx()
> nameEx("grid.delay")
> ### * grid.delay
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.delay
> ### Title: Encapsulate calculations and generating a grob
> ### Aliases: grid.delay delayGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.delay({
+               w <- convertWidth(unit(1, "inches"), "npc")
+               rectGrob(width=w)
+             },
+             list())
> 
> 
> 
> cleanEx()
> nameEx("grid.draw")
> ### * grid.draw
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.draw
> ### Title: Draw a grid grob
> ### Aliases: grid.draw
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> ## Create a graphical object, but don't draw it
> l <- linesGrob()
> ## Draw it
> grid.draw(l)
> 
> 
> 
> cleanEx()
> nameEx("grid.edit")
> ### * grid.edit
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.edit
> ### Title: Edit the Description of a Grid Graphical Object
> ### Aliases: grid.edit grid.gedit editGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> grid.xaxis(name = "xa", vp = viewport(width=.5, height=.5))
> grid.edit("xa", gp = gpar(col="red"))
> # won't work because no ticks (at is NULL)
> try(grid.edit(gPath("xa", "ticks"), gp = gpar(col="green")))
Error in editDLfromGPath(gPath, specs, strict, grep, global, redraw) : 
  'gPath' (xa::ticks) not found
> grid.edit("xa", at = 1:4/5)
> # Now it should work
> try(grid.edit(gPath("xa", "ticks"), gp = gpar(col="green")))
> 
> 
> 
> cleanEx()
> nameEx("grid.force")
> ### * grid.force
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.force
> ### Title: Force a grob into its components
> ### Aliases: grid.force grid.force.default grid.force.gPath grid.force.grob
> ###   forceGrob grid.revert grid.revert.gPath grid.revert.grob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> pushViewport(viewport(width=.5, height=.5))
> # Draw xaxis
> grid.xaxis(name="xax")
> grid.ls()
GRID.text.261
xax
> # Force xaxis
> grid.force()
> grid.ls()
GRID.text.261
xax
  major
  ticks
  labels
> # Revert xaxis
> grid.revert()
> grid.ls()
GRID.text.261
xax
> # Draw and force yaxis
> grid.force(yaxisGrob(), draw=TRUE)
forcedgrob[GRID.yaxis.262] 
> grid.ls()
GRID.text.261
xax
GRID.yaxis.262
  major
  ticks
  labels
> # Revert yaxis
> grid.revert()
> grid.ls()
GRID.text.261
xax
GRID.yaxis.262
> # Force JUST xaxis
> grid.force("xax")
> grid.ls()
GRID.text.261
xax
  major
  ticks
  labels
GRID.yaxis.262
> # Force ALL
> grid.force()
> grid.ls()
GRID.text.261
xax
  major
  ticks
  labels
GRID.yaxis.262
  major
  ticks
  labels
> # Revert JUST xaxis
> grid.revert("xax")
> grid.ls()
GRID.text.261
xax
GRID.yaxis.262
  major
  ticks
  labels
> 
> 
> 
> cleanEx()
> nameEx("grid.frame")
> ### * grid.frame
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.frame
> ### Title: Create a Frame for Packing Objects
> ### Aliases: grid.frame frameGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> grid.frame(name="gf", draw=TRUE)
> grid.pack("gf", rectGrob(gp=gpar(fill="grey")), width=unit(1, "null"))
> grid.pack("gf", textGrob("hi there"), side="right")
> 
> 
> 
> cleanEx()
> nameEx("grid.function")
> ### * grid.function
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.function
> ### Title: Draw a curve representing a function
> ### Aliases: grid.function functionGrob grid.abline
> ### Keywords: dplot
> 
> ### ** Examples
> 
>     # abline
>     # NOTE: in ROOT viewport on screen, (0, 0) at top-left
>     #       and "native" is pixels!
>     grid.function(function(x) list(x=x, y=0 + 1*x))
>     # a more "normal" viewport with default normalized "native" coords
>     grid.newpage()
>     pushViewport(viewport())
>     grid.function(function(x) list(x=x, y=0 + 1*x))
>     # slightly simpler
>     grid.newpage()
>     pushViewport(viewport())
>     grid.abline()
>     # sine curve
>     grid.newpage()
>     pushViewport(viewport(xscale=c(0, 2*pi), yscale=c(-1, 1)))
>     grid.function(function(x) list(x=x, y=sin(x)))
>     # constrained sine curve
>     grid.newpage()
>     pushViewport(viewport(xscale=c(0, 2*pi), yscale=c(-1, 1)))
>     grid.function(function(x) list(x=x, y=sin(x)),
+                   range=0:1)
>     # inverse sine curve
>     grid.newpage()
>     pushViewport(viewport(xscale=c(-1, 1), yscale=c(0, 2*pi)))
>     grid.function(function(y) list(x=sin(y), y=y),
+                   range="y")
>     # parametric function
>     grid.newpage()
>     pushViewport(viewport(xscale=c(-1, 1), yscale=c(-1, 1)))
>     grid.function(function(t) list(x=cos(t), y=sin(t)),
+                   range=c(0, 9*pi/5))
>     # physical abline
>     grid.newpage()
>     grid.function(function(x) list(x=x, y=0 + 1*x),
+                   units="in")
> 
> 
> 
> cleanEx()
> nameEx("grid.get")
> ### * grid.get
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.get
> ### Title: Get a Grid Graphical Object
> ### Aliases: grid.get grid.gget getGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.xaxis(name="xa")
> grid.get("xa")
xaxis[xa] 
> grid.get(gPath("xa", "ticks"))
NULL
> 
> grid.draw(gTree(name="gt", children=gList(xaxisGrob(name="axis"))))
> grid.get(gPath("gt", "axis", "ticks"))
NULL
> 
> 
> 
> cleanEx()
> nameEx("grid.grab")
> ### * grid.grab
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.grab
> ### Title: Grab the current grid output
> ### Aliases: grid.grab grid.grabExpr
> ### Keywords: dplot
> 
> ### ** Examples
> 
> pushViewport(viewport(width=.5, height=.5))
> grid.rect()
> grid.points(stats::runif(10), stats::runif(10))
> popViewport()
> grab <- grid.grab()
> grid.newpage()
> grid.draw(grab)
> 
> 
> 
> cleanEx()
> nameEx("grid.grep")
> ### * grid.grep
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.grep
> ### Title: Search for Grobs and/or Viewports
> ### Aliases: grid.grep
> ### Keywords: dplot
> 
> ### ** Examples
> 
> # A gTree, called "grandparent", with child gTree,
> # called "parent", with childrenvp vpStack (vp2 within vp1)
> # and child grob, called "child", with vp vpPath (down to vp2)
> sampleGTree <- gTree(name="grandparent",
+                      children=gList(gTree(name="parent",
+                           children=gList(grob(name="child", vp="vp1::vp2")),
+                           childrenvp=vpStack(viewport(name="vp1"),
+                                              viewport(name="vp2")))))
> # Searching for grobs
> grid.grep("parent", sampleGTree)
grandparent::parent 
> grid.grep("parent", sampleGTree, strict=TRUE)
character(0)
> grid.grep("grandparent", sampleGTree, strict=TRUE)
grandparent 
> grid.grep("grandparent::parent", sampleGTree)
grandparent::parent 
> grid.grep("parent::child", sampleGTree)
grandparent::parent::child 
> grid.grep("[a-z]", sampleGTree, grep=TRUE)
grandparent 
> grid.grep("[a-z]", sampleGTree, grep=TRUE, global=TRUE)
[[1]]
grandparent 

[[2]]
grandparent::parent 

[[3]]
grandparent::parent::child 

> # Searching for viewports
> grid.grep("vp1", sampleGTree, viewports=TRUE)
vp1 
> grid.grep("vp2", sampleGTree, viewports=TRUE)
vp1::vp2 
> grid.grep("vp", sampleGTree, viewports=TRUE, grep=TRUE)
vp1 
> grid.grep("vp2", sampleGTree, viewports=TRUE, strict=TRUE)
character(0)
> grid.grep("vp1::vp2", sampleGTree, viewports=TRUE)
vp1::vp2 
> # Searching for both
> grid.grep("[a-z]", sampleGTree, viewports=TRUE, grep=TRUE, global=TRUE)
[[1]]
grandparent 

[[2]]
grandparent::parent 

[[3]]
vp1 

[[4]]
vp1::vp2 

[[5]]
grandparent::parent::child 

> 
> 
> 
> cleanEx()
> nameEx("grid.group")
> ### * grid.group
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.group
> ### Title: Draw a Group
> ### Aliases: grid.group groupGrob grid.define defineGrob grid.use useGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## NOTE: on devices without support for groups (or masks or patterns),
> ##       there will only be two overlapping opaque circles 
> grid.newpage()
> pat <- pattern(rasterGrob(matrix(c(.5, 1, 1, .5), nrow=2),
+                           width=unit(1, "cm"),
+                           height=unit(1, "cm"),
+                           interpolate=FALSE),
+                width=unit(1, "cm"), height=unit(1, "cm"),
+                extend="repeat")
> grid.rect(gp=gpar(col=NA, fill=pat))
> mask <- rectGrob(gp=gpar(col=NA, fill=rgb(0,0,0,.5)))
> pushViewport(viewport(mask=mask))
> pushViewport(viewport(y=.5, height=.5, just="bottom"))
> grid.circle(1:2/3, r=.45, gp=gpar(fill=2:3))
> popViewport()
> pushViewport(viewport(y=0, height=.5, just="bottom"))
> grid.group(circleGrob(1:2/3, r=.45, gp=gpar(fill=2:3)))
> popViewport()
> 
> 
> 
> cleanEx()
> nameEx("grid.layout")
> ### * grid.layout
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.layout
> ### Title: Create a Grid Layout
> ### Aliases: grid.layout
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## A variety of layouts (some a bit mid-bending ...)
> layout.torture()
> ## Demonstration of layout justification
> grid.newpage()
> testlay <- function(just="centre") {
+   pushViewport(viewport(layout=grid.layout(1, 1, widths=unit(1, "inches"),
+                           heights=unit(0.25, "npc"),
+                           just=just)))
+   pushViewport(viewport(layout.pos.col=1, layout.pos.row=1))
+   grid.rect()
+   grid.text(paste(just, collapse="-"))
+   popViewport(2)
+ }
> testlay()
> testlay(c("left", "top"))
> testlay(c("right", "top"))
> testlay(c("right", "bottom"))
> testlay(c("left", "bottom"))
> testlay(c("left"))
> testlay(c("right"))
> testlay(c("bottom"))
> testlay(c("top"))
> 
> 
> 
> cleanEx()
> nameEx("grid.lines")
> ### * grid.lines
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.lines
> ### Title: Draw Lines in a Grid Viewport
> ### Aliases: grid.lines linesGrob grid.polyline polylineGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.lines()
> # Using id (NOTE: locations are not in consecutive blocks)
> grid.newpage()
> grid.polyline(x=c((0:4)/10, rep(.5, 5), (10:6)/10, rep(.5, 5)),
+              y=c(rep(.5, 5), (10:6/10), rep(.5, 5), (0:4)/10),
+              id=rep(1:5, 4),
+              gp=gpar(col=1:5, lwd=3))
> # Using id.lengths
> grid.newpage()
> grid.polyline(x=outer(c(0, .5, 1, .5), 5:1/5),
+              y=outer(c(.5, 1, .5, 0), 5:1/5),
+              id.lengths=rep(4, 5),
+              gp=gpar(col=1:5, lwd=3))
> 
> 
> 
> cleanEx()
> nameEx("grid.locator")
> ### * grid.locator
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.locator
> ### Title: Capture a Mouse Click
> ### Aliases: grid.locator
> ### Keywords: dplot
> 
> ### ** Examples
> 
> if (dev.interactive()) {
+   ## Need to write a more sophisticated unit as.character method
+   unittrim <- function(unit) {
+     sub("^([0-9]+|[0-9]+[.][0-9])[0-9]*", "\\1", as.character(unit))
+   }
+   do.click <- function(unit) {
+     click.locn <- grid.locator(unit)
+     grid.segments(unit.c(click.locn$x, unit(0, "npc")),
+                   unit.c(unit(0, "npc"), click.locn$y),
+                   click.locn$x, click.locn$y,
+                   gp=gpar(lty="dashed", col="grey"))
+     grid.points(click.locn$x, click.locn$y, pch=16, size=unit(1, "mm"))
+     clickx <- unittrim(click.locn$x)
+     clicky <- unittrim(click.locn$y)
+     grid.text(paste0("(", clickx, ", ", clicky, ")"),
+               click.locn$x + unit(2, "mm"), click.locn$y,
+               just="left")
+   }
+ 
+   grid.newpage() # (empty slate)
+   ## device
+   do.click("inches")
+   Sys.sleep(1)
+ 
+   pushViewport(viewport(width=0.5, height=0.5,
+                         xscale=c(0, 100), yscale=c(0, 10)))
+   grid.rect()
+   grid.xaxis()
+   grid.yaxis()
+   do.click("native")
+   popViewport()
+ }
> 
> 
> 
> cleanEx()
> nameEx("grid.ls")
> ### * grid.ls
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.ls
> ### Title: List the names of grobs or viewports
> ### Aliases: grid.ls nestedListing pathListing grobPathListing
> ### Keywords: dplot
> 
> ### ** Examples
> 
> # A gTree, called "parent", with childrenvp vpTree (vp2 within vp1)
> # and child grob, called "child", with vp vpPath (down to vp2)
> sampleGTree <- gTree(name="parent",
+                      children=gList(grob(name="child", vp="vp1::vp2")),
+                      childrenvp=vpTree(parent=viewport(name="vp1"),
+                                        children=vpList(viewport(name="vp2"))))
> grid.ls(sampleGTree)
parent
  child
> # Show viewports too
> grid.ls(sampleGTree, viewports=TRUE)
parent
  vp1
    vp2
      2
  vp1
    vp2
      child
      2
> # Only show viewports
> grid.ls(sampleGTree, viewports=TRUE, grobs=FALSE)
vp1
  vp2
    2
vp1
  vp2
    2
> # Alternate displays
> # nested listing, custom indent
> grid.ls(sampleGTree, viewports=TRUE, print=nestedListing, gindent="--")
parent
--vp1
----vp2
------2
--vp1
----vp2
------child
------2
> # path listing
> grid.ls(sampleGTree, viewports=TRUE, print=pathListing)
            | parent
vp1
vp1::vp2
vp1::vp2::2
vp1
vp1::vp2
vp1::vp2    | parent::child
vp1::vp2::2
> # path listing, without grobs aligned
> grid.ls(sampleGTree, viewports=TRUE, print=pathListing, gAlign=FALSE)
 | parent
vp1
vp1::vp2
vp1::vp2::2
vp1
vp1::vp2
vp1::vp2 | parent::child
vp1::vp2::2
> # grob path listing
> grid.ls(sampleGTree, viewports=TRUE, print=grobPathListing)
         | parent
vp1::vp2 | parent::child
> # path listing, grobs only
> grid.ls(sampleGTree, print=pathListing)
 | parent
 | parent::child
> # path listing, viewports only
> grid.ls(sampleGTree, viewports=TRUE, grobs=FALSE, print=pathListing)
vp1
vp1::vp2
vp1::vp2::2
vp1
vp1::vp2
vp1::vp2::2
> # raw flat listing
> str(grid.ls(sampleGTree, viewports=TRUE, print=FALSE))
List of 6
 $ name   : chr [1:8] "parent" "vp1" "vp2" "2" ...
 $ gDepth : num [1:8] 0 1 1 1 1 1 1 1
 $ vpDepth: num [1:8] 0 0 1 2 0 1 2 2
 $ gPath  : chr [1:8] "" "parent" "parent" "parent" ...
 $ vpPath : chr [1:8] "" "" "vp1" "vp1::vp2" ...
 $ type   : chr [1:8] "gTreeListing" "vpListing" "vpListing" "vpUpListing" ...
 - attr(*, "class")= chr "flatGridListing"
> 
> 
> 
> cleanEx()
> nameEx("grid.move.to")
> ### * grid.move.to
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.move.to
> ### Title: Move or Draw to a Specified Position
> ### Aliases: grid.move.to grid.line.to moveToGrob lineToGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> grid.move.to(0.5, 0.5)
> grid.line.to(1, 1)
> grid.line.to(0.5, 0)
> pushViewport(viewport(x=0, y=0, width=0.25, height=0.25, just=c("left", "bottom")))
> grid.rect()
> grid.grill()
> grid.line.to(0.5, 0.5)
> popViewport()
> 
> 
> 
> cleanEx()
> nameEx("grid.null")
> ### * grid.null
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.null
> ### Title: Null Graphical Object
> ### Aliases: grid.null nullGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> grid.null(name="ref")
> grid.rect(height=grobHeight("ref"))
> grid.segments(0, 0, grobX("ref", 0), grobY("ref", 0))
> 
> 
> 
> cleanEx()
> nameEx("grid.path")
> ### * grid.path
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.path
> ### Title: Draw a Path
> ### Aliases: grid.path pathGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> pathSample <- function(x, y, rule, gp = gpar()) {
+     if (is.na(rule))
+         grid.path(x, y, id = rep(1:2, each = 4), gp = gp)
+     else
+         grid.path(x, y, id = rep(1:2, each = 4), rule = rule, gp = gp)
+     if (!is.na(rule))
+         grid.text(paste("Rule:", rule), y = 0, just = "bottom")
+ }
> 
> pathTriplet <- function(x, y, title) {
+     pushViewport(viewport(height = 0.9, layout = grid.layout(1, 3),
+                           gp = gpar(cex = .7)))
+     grid.rect(y = 1, height = unit(1, "char"), just = "top",
+               gp = gpar(col = NA, fill = "grey"))
+     grid.text(title, y = 1, just = "top")
+     pushViewport(viewport(layout.pos.col = 1))
+     pathSample(x, y, rule = "winding",
+                gp = gpar(fill = "grey"))
+     popViewport()
+     pushViewport(viewport(layout.pos.col = 2))
+     pathSample(x, y, rule = "evenodd",
+                gp = gpar(fill = "grey"))
+     popViewport()
+     pushViewport(viewport(layout.pos.col = 3))
+     pathSample(x, y, rule = NA)
+     popViewport()
+     popViewport()
+ }
> 
> pathTest <- function() {
+     grid.newpage()
+     pushViewport(viewport(layout = grid.layout(5, 1)))
+     pushViewport(viewport(layout.pos.row = 1))
+     pathTriplet(c(.1, .1, .9, .9, .2, .2, .8, .8),
+                 c(.1, .9, .9, .1, .2, .8, .8, .2),
+                 "Nested rectangles, both clockwise")
+     popViewport()
+     pushViewport(viewport(layout.pos.row = 2))
+     pathTriplet(c(.1, .1, .9, .9, .2, .8, .8, .2),
+                 c(.1, .9, .9, .1, .2, .2, .8, .8),
+                 "Nested rectangles, outer clockwise, inner anti-clockwise")
+     popViewport()
+     pushViewport(viewport(layout.pos.row = 3))
+     pathTriplet(c(.1, .1, .4, .4, .6, .9, .9, .6),
+                 c(.1, .4, .4, .1, .6, .6, .9, .9),
+                 "Disjoint rectangles")
+     popViewport()
+     pushViewport(viewport(layout.pos.row = 4))
+     pathTriplet(c(.1, .1, .6, .6, .4, .4, .9, .9),
+                 c(.1, .6, .6, .1, .4, .9, .9, .4),
+                 "Overlapping rectangles, both clockwise")
+     popViewport()
+     pushViewport(viewport(layout.pos.row = 5))
+     pathTriplet(c(.1, .1, .6, .6, .4, .9, .9, .4),
+                 c(.1, .6, .6, .1, .4, .4, .9, .9),
+                 "Overlapping rectangles, one clockwise, other anti-clockwise")
+     popViewport()
+     popViewport()
+ }
> 
> pathTest()
> 
> # Drawing multiple paths at once
> holed_rect <- cbind(c(.15, .15, -.15, -.15, .1, .1, -.1, -.1), 
+                     c(.15, -.15, -.15, .15, .1, -.1, -.1, .1))
> holed_rects <- rbind(
+     holed_rect + matrix(c(.7, .2), nrow = 8, ncol = 2, byrow = TRUE),
+     holed_rect + matrix(c(.7, .8), nrow = 8, ncol = 2, byrow = TRUE),
+     holed_rect + matrix(c(.2, .5), nrow = 8, ncol = 2, byrow = TRUE)
+ )
> grid.newpage()
> grid.path(x = holed_rects[, 1], y = holed_rects[, 2], 
+           id = rep(1:6, each = 4), pathId = rep(1:3, each = 8),
+           gp = gpar(fill = c('red', 'blue', 'green')),
+           rule = 'evenodd')
> 
> # Not specifying pathId will treat all points as part of the same path, thus 
> # having same fill
> grid.newpage()
> grid.path(x = holed_rects[, 1], y = holed_rects[, 2], 
+           id = rep(1:6, each = 4),
+           gp = gpar(fill = c('red', 'blue', 'green')),
+           rule = 'evenodd')
> 
> 
> 
> cleanEx()
> nameEx("grid.plot.and.legend")
> ### * grid.plot.and.legend
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.plot.and.legend
> ### Title: A Simple Plot and Legend Demo
> ### Aliases: grid.plot.and.legend
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.plot.and.legend()
> 
> 
> 
> cleanEx()
> nameEx("grid.polygon")
> ### * grid.polygon
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.polygon
> ### Title: Draw a Polygon
> ### Aliases: grid.polygon polygonGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.polygon()
> # Using id (NOTE: locations are not in consecutive blocks)
> grid.newpage()
> grid.polygon(x=c((0:4)/10, rep(.5, 5), (10:6)/10, rep(.5, 5)),
+              y=c(rep(.5, 5), (10:6/10), rep(.5, 5), (0:4)/10),
+              id=rep(1:5, 4),
+              gp=gpar(fill=1:5))
> # Using id.lengths
> grid.newpage()
> grid.polygon(x=outer(c(0, .5, 1, .5), 5:1/5),
+              y=outer(c(.5, 1, .5, 0), 5:1/5),
+              id.lengths=rep(4, 5),
+              gp=gpar(fill=1:5))
> 
> 
> 
> cleanEx()
> nameEx("grid.raster")
> ### * grid.raster
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.raster
> ### Title: Render a raster object
> ### Aliases: grid.raster rasterGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> redGradient <- matrix(hcl(0, 80, seq(50, 80, 10)),
+                       nrow=4, ncol=5)
> # interpolated
> grid.newpage()
> grid.raster(redGradient)
> # blocky
> grid.newpage()
> grid.raster(redGradient, interpolate=FALSE)
> # blocky and stretched
> grid.newpage()
> grid.raster(redGradient, interpolate=FALSE, height=unit(1, "npc"))
> 
> # The same raster drawn several times
> grid.newpage()
> grid.raster(0, x=1:3/4, y=1:3/4, width=.1, interpolate=FALSE)
> 
> 
> 
> cleanEx()
> nameEx("grid.record")
> ### * grid.record
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.record
> ### Title: Encapsulate calculations and drawing
> ### Aliases: grid.record recordGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.record({
+               w <- convertWidth(unit(1, "inches"), "npc")
+               grid.rect(width=w)
+             },
+             list())
> 
> 
> 
> cleanEx()
> nameEx("grid.reorder")
> ### * grid.reorder
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.reorder
> ### Title: Reorder the children of a gTree
> ### Aliases: grid.reorder reorderGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> # gTree with two children, "red-rect" and "blue-rect" (in that order)
> gt <- gTree(children=gList(
+                 rectGrob(gp=gpar(col=NA, fill="red"),
+                          width=.8, height=.2, name="red-rect"),
+                 rectGrob(gp=gpar(col=NA, fill="blue"),
+                          width=.2, height=.8, name="blue-rect")),
+             name="gt")
> grid.newpage()
> grid.draw(gt)
> # Spec entire order as numeric (blue-rect, red-rect)
> grid.reorder("gt", 2:1)
> # Spec entire order as character
> grid.reorder("gt", c("red-rect", "blue-rect"))
> # Only spec the one I want behind as character
> grid.reorder("gt", "blue-rect")
> # Only spec the one I want in front as character
> grid.reorder("gt", "blue-rect", back=FALSE)
> 
> 
> 
> cleanEx()
> nameEx("grid.roundrect")
> ### * grid.roundrect
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: roundrect
> ### Title: Draw a rectangle with rounded corners
> ### Aliases: roundrect grid.roundrect roundrectGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.roundrect(width=.5, height=.5, name="rr")
> theta <- seq(0, 360, length.out=50)
> for (i in 1:50)
+     grid.circle(x=grobX("rr", theta[i]),
+                 y=grobY("rr", theta[i]),
+                 r=unit(1, "mm"),
+                 gp=gpar(fill="black"))
> 
> 
> 
> cleanEx()
> nameEx("grid.show.layout")
> ### * grid.show.layout
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.show.layout
> ### Title: Draw a Diagram of a Grid Layout
> ### Aliases: grid.show.layout
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## Diagram of a simple layout
> grid.show.layout(grid.layout(4,2,
+                      heights=unit(rep(1, 4),
+                                   c("lines", "lines", "lines", "null")),
+                      widths=unit(c(1, 1), "inches")))
> 
> 
> 
> cleanEx()
> nameEx("grid.show.viewport")
> ### * grid.show.viewport
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.show.viewport
> ### Title: Draw a Diagram of a Grid Viewport
> ### Aliases: grid.show.viewport
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## Diagram of a sample viewport
> grid.show.viewport(viewport(x=0.6, y=0.6,
+                             width=unit(1, "inches"), height=unit(1, "inches")))
> grid.show.viewport(viewport(layout.pos.row=2, layout.pos.col=2:3),
+                    grid.layout(3, 4))
> 
> 
> 
> cleanEx()
> nameEx("grid.stroke")
> ### * grid.stroke
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.stroke
> ### Title: Stroke or Fill a Path
> ### Aliases: grid.stroke strokeGrob strokeGrob.grob strokeGrob.GridPath
> ###   grid.fill fillGrob fillGrob.grob fillGrob.GridPath grid.fillStroke
> ###   fillStrokeGrob fillStrokeGrob.grob fillStrokeGrob.GridPath as.path
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## NOTE: on devices without support for stroking and filling
> ##       nothing will be drawn
> grid.newpage()
> grid.stroke(textGrob("hello", gp=gpar(cex=10)))
> grid.fill(circleGrob(1:2/3, r=.3), gp=gpar(fill=rgb(1,0,0,.5)))
> 
> 
> 
> cleanEx()
> nameEx("grid.text")
> ### * grid.text
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.text
> ### Title: Draw Text
> ### Aliases: grid.text textGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> x <- stats::runif(20)
> y <- stats::runif(20)
> rot <- stats::runif(20, 0, 360)
> grid.text("SOMETHING NICE AND BIG", x=x, y=y, rot=rot,
+           gp=gpar(fontsize=20, col="grey"))
> grid.text("SOMETHING NICE AND BIG", x=x, y=y, rot=rot,
+           gp=gpar(fontsize=20), check.overlap=TRUE)
> grid.newpage()
> draw.text <- function(just, i, j) {
+   grid.text("ABCD", x=x[j], y=y[i], just=just)
+   grid.text(deparse(substitute(just)), x=x[j], y=y[i] + unit(2, "lines"),
+             gp=gpar(col="grey", fontsize=8))
+ }
> x <- unit(1:4/5, "npc")
> y <- unit(1:4/5, "npc")
> grid.grill(h=y, v=x, gp=gpar(col="grey"))
> draw.text(c("bottom"), 1, 1)
> draw.text(c("left", "bottom"), 2, 1)
> draw.text(c("right", "bottom"), 3, 1)
> draw.text(c("centre", "bottom"), 4, 1)
> draw.text(c("centre"), 1, 2)
> draw.text(c("left", "centre"), 2, 2)
> draw.text(c("right", "centre"), 3, 2)
> draw.text(c("centre", "centre"), 4, 2)
> draw.text(c("top"), 1, 3)
> draw.text(c("left", "top"), 2, 3)
> draw.text(c("right", "top"), 3, 3)
> draw.text(c("centre", "top"), 4, 3)
> draw.text(c(), 1, 4)
> draw.text(c("left"), 2, 4)
> draw.text(c("right"), 3, 4)
> draw.text(c("centre"), 4, 4)
> 
> 
> 
> cleanEx()
> nameEx("grid.xspline")
> ### * grid.xspline
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: grid.xspline
> ### Title: Draw an Xspline
> ### Aliases: grid.xspline xsplineGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
> x <- c(0.25, 0.25, 0.75, 0.75)
> y <- c(0.25, 0.75, 0.75, 0.25)
> 
> xsplineTest <- function(s, i, j, open) {
+   pushViewport(viewport(layout.pos.col=j, layout.pos.row=i))
+   grid.points(x, y, default.units="npc", pch=16, size=unit(2, "mm"))
+   grid.xspline(x, y, shape=s, open=open, gp=gpar(fill="grey"))
+   grid.text(s, gp=gpar(col="grey"),
+             x=unit(x, "npc") + unit(c(-1, -1, 1, 1), "mm"),
+             y=unit(y, "npc") + unit(c(-1, 1, 1, -1), "mm"),
+             hjust=c(1, 1, 0, 0),
+             vjust=c(1, 0, 0, 1))
+   popViewport()
+ }
> 
> pushViewport(viewport(width=.5, x=0, just="left",
+                       layout=grid.layout(3, 3, respect=TRUE)))
> pushViewport(viewport(layout.pos.row=1))
> grid.text("Open Splines", y=1, just="bottom")
> popViewport()
> xsplineTest(c(0, -1, -1, 0), 1, 1, TRUE)
> xsplineTest(c(0, -1,  0, 0), 1, 2, TRUE)
> xsplineTest(c(0, -1,  1, 0), 1, 3, TRUE)
> xsplineTest(c(0,  0, -1, 0), 2, 1, TRUE)
> xsplineTest(c(0,  0,  0, 0), 2, 2, TRUE)
> xsplineTest(c(0,  0,  1, 0), 2, 3, TRUE)
> xsplineTest(c(0,  1, -1, 0), 3, 1, TRUE)
> xsplineTest(c(0,  1,  0, 0), 3, 2, TRUE)
> xsplineTest(c(0,  1,  1, 0), 3, 3, TRUE)
> popViewport()
> pushViewport(viewport(width=.5, x=1, just="right",
+                       layout=grid.layout(3, 3, respect=TRUE)))
> pushViewport(viewport(layout.pos.row=1))
> grid.text("Closed Splines", y=1, just="bottom")
> popViewport()
> xsplineTest(c(-1, -1, -1, -1), 1, 1, FALSE)
> xsplineTest(c(-1, -1,  0, -1), 1, 2, FALSE)
> xsplineTest(c(-1, -1,  1, -1), 1, 3, FALSE)
> xsplineTest(c( 0,  0, -1,  0), 2, 1, FALSE)
> xsplineTest(c( 0,  0,  0,  0), 2, 2, FALSE)
> xsplineTest(c( 0,  0,  1,  0), 2, 3, FALSE)
> xsplineTest(c( 1,  1, -1,  1), 3, 1, FALSE)
> xsplineTest(c( 1,  1,  0,  1), 3, 2, FALSE)
> xsplineTest(c( 1,  1,  1,  1), 3, 3, FALSE)
> popViewport()
> 
> 
> 
> cleanEx()
> nameEx("legendGrob")
> ### * legendGrob
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: legendGrob
> ### Title: Constructing a Legend Grob
> ### Aliases: legendGrob grid.legend
> ### Keywords: aplot
> 
> ### ** Examples
> 
>   ## Data:
>   n <- 10
>   x <- stats::runif(n) ; y1 <- stats::runif(n) ; y2 <- stats::runif(n)
>   ## Construct the grobs :
>   plot <- gTree(children=gList(rectGrob(),
+                   pointsGrob(x, y1, pch=21, gp=gpar(col=2, fill="gray")),
+                   pointsGrob(x, y2, pch=22, gp=gpar(col=3, fill="gray")),
+                   xaxisGrob(),
+                   yaxisGrob()))
>   legd <- legendGrob(c("Girls", "Boys", "Other"), pch=21:23,
+                      gp=gpar(col = 2:4, fill = "gray"))
>   gg <- packGrob(packGrob(frameGrob(), plot),
+                  legd, height=unit(1,"null"), side="right")
> 
>   ## Now draw it on a new device page:
>   grid.newpage()
>   pushViewport(viewport(width=0.8, height=0.8))
>   grid.draw(gg)
> 
> 
> 
> cleanEx()
> nameEx("resolveRasterSize")
> ### * resolveRasterSize
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: resolveRasterSize
> ### Title: Utility function to resolve the size of a raster grob
> ### Aliases: resolveRasterSize
> ### Keywords: dplot
> 
> ### ** Examples
> 
> # Square raster
> rg <- rasterGrob(matrix(0))
> # Fill the complete page (if page is square)
> grid.newpage()
> resolveRasterSize(rg)$height
[1] 6.8inches
> grid.draw(rg)
> # Forced to fit tall thin region
> grid.newpage()
> pushViewport(viewport(width=.1))
> resolveRasterSize(rg)$height
[1] 0.68inches
> grid.draw(rg)
> 
> 
> 
> cleanEx()
> nameEx("showGrob")
> ### * showGrob
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: showGrob
> ### Title: Label grid grobs.
> ### Aliases: showGrob
> ### Keywords: dplot
> 
> ### ** Examples
> 
>     grid.newpage()
>     gt <- gTree(childrenvp=vpStack(
+                   viewport(x=0, width=.5, just="left", name="vp"),
+                   viewport(y=.5, height=.5, just="bottom", name="vp2")),
+                 children=gList(rectGrob(vp="vp::vp2", name="child")),
+                 name="parent")
>     grid.draw(gt)
>     showGrob()
>     showGrob(gPath="child")
>     showGrob(recurse=FALSE)
>     showGrob(depth=1)
>     showGrob(depth=2)
>     showGrob(depth=1:2)
>     showGrob(gt)
>     showGrob(gt, gPath="child")
>     showGrob(just="left", gp=gpar(col="red", cex=.5), rot=45)
>     showGrob(labelfun=function(grob, ...) {
+         x <- grobX(grob, "west")
+         y <- grobY(grob, "north")
+         gTree(children=gList(rectGrob(x=x, y=y,
+                 width=stringWidth(grob$name) + unit(2, "mm"),
+                 height=stringHeight(grob$name) + unit(2, "mm"),
+                 gp=gpar(col=NA, fill=rgb(1, 0, 0, .5)),
+                 just=c("left", "top")),
+                 textGrob(grob$name,
+                          x=x + unit(1, "mm"), y=y - unit(1, "mm"),
+                          just=c("left", "top"))))
+     })
> 
> ## Not run: 
> ##D     # Examples from higher-level packages
> ##D 
> ##D     library(lattice)
> ##D     # Ctrl-c after first example
> ##D     example(histogram)
> ##D     showGrob()
> ##D     showGrob(gPath="plot_01.ylab")
> ##D 
> ##D     library(ggplot2)
> ##D     # Ctrl-c after first example
> ##D     example(qplot)
> ##D     showGrob()
> ##D     showGrob(recurse=FALSE)
> ##D     showGrob(gPath="panel-3-3")
> ##D     showGrob(gPath="axis.title", grep=TRUE)
> ##D     showGrob(depth=2)
> ## End(Not run)
> 
> 
> 
> cleanEx()
> nameEx("showViewport")
> ### * showViewport
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: showViewport
> ### Title: Display grid viewports.
> ### Aliases: showViewport
> ### Keywords: dplot
> 
> ### ** Examples
> 
> showViewport(viewport(width=.5, height=.5, name="vp"))
> 
> grid.newpage()
> pushViewport(viewport(width=.5, height=.5, name="vp"))
> upViewport()
> showViewport(vpPath("vp"))
> 
> showViewport(vpStack(viewport(width=.5, height=.5, name="vp1"),
+                      viewport(width=.5, height=.5, name="vp2")),
+              newpage=TRUE)
> 
> showViewport(vpStack(viewport(width=.5, height=.5, name="vp1"),
+                      viewport(width=.5, height=.5, name="vp2")),
+              fill=rgb(1:0, 0:1, 0, .1),
+              newpage=TRUE)
> 
> 
> 
> cleanEx()
> nameEx("unit")
> ### * unit
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: unit
> ### Title: Function to Create a Unit Object
> ### Aliases: unit
> ### Keywords: dplot
> 
> ### ** Examples
> 
> unit(1, "npc")
[1] 1npc
> unit(1:3/4, "npc")
[1] 0.25npc 0.5npc  0.75npc
> unit(1:3/4, "npc") + unit(1, "inches")
[1] sum(0.25npc, 1inches) sum(0.5npc, 1inches)  sum(0.75npc, 1inches)
> min(unit(0.5, "npc"), unit(1, "inches"))
[1] min(0.5npc, 1inches)
> unit.c(unit(0.5, "npc"), unit(2, "inches") + unit(1:3/4, "npc"),
+        unit(1, "strwidth", "hi there"))
[1] 0.5npc                sum(2inches, 0.25npc) sum(2inches, 0.5npc) 
[4] sum(2inches, 0.75npc) 1strwidth            
> x <- unit(1:5, "npc")
> x[2:4]
[1] 2npc 3npc 4npc
> x[2:4] <- unit(1, "mm")
> x
[1] 1npc 1mm  1mm  1mm  5npc
> 
> 
> 
> cleanEx()
> nameEx("unit.length")
> ### * unit.length
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: unit.length
> ### Title: Length of a Unit Object
> ### Aliases: unit.length
> ### Keywords: dplot
> 
> ### ** Examples
> 
> length(unit(1:3, "npc"))
[1] 3
> length(unit(1:3, "npc") + unit(1, "inches"))
[1] 3
> length(max(unit(1:3, "npc") + unit(1, "inches")))
[1] 1
> length(max(unit(1:3, "npc") + unit(1, "strwidth", "a"))*4)
[1] 1
> length(unit(1:3, "npc") + unit(1, "strwidth", "a")*4)
[1] 3
> 
> 
> 
> cleanEx()
> nameEx("unit.pmin")
> ### * unit.pmin
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: unit.pmin
> ### Title: Parallel Unit Minima and Maxima
> ### Aliases: unit.pmin unit.pmax unit.psum
> ### Keywords: dplot
> 
> ### ** Examples
> 
> max(unit(1:3, "cm"), unit(0.5, "npc"))
[1] max(1cm, 2cm, 3cm, 0.5npc)
> unit.pmax(unit(1:3, "cm"), unit(0.5, "npc"))
[1] max(1cm, 0.5npc) max(2cm, 0.5npc) max(3cm, 0.5npc)
> 
> 
> 
> cleanEx()
> nameEx("unit.rep")
> ### * unit.rep
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: unit.rep
> ### Title: Replicate Elements of Unit Objects
> ### Aliases: unit.rep
> ### Keywords: dplot
> 
> ### ** Examples
> 
> rep(unit(1:3, "npc"), 3)
[1] 1npc 2npc 3npc 1npc 2npc 3npc 1npc 2npc 3npc
> rep(unit(1:3, "npc"), 1:3)
[1] 1npc 2npc 2npc 3npc 3npc 3npc
> rep(unit(1:3, "npc") + unit(1, "inches"), 3)
[1] sum(1npc, 1inches) sum(2npc, 1inches) sum(3npc, 1inches) sum(1npc, 1inches)
[5] sum(2npc, 1inches) sum(3npc, 1inches) sum(1npc, 1inches) sum(2npc, 1inches)
[9] sum(3npc, 1inches)
> rep(max(unit(1:3, "npc") + unit(1, "inches")), 3)
[1] max(sum(1npc, 1inches), sum(2npc, 1inches), sum(3npc, 1inches))
[2] max(sum(1npc, 1inches), sum(2npc, 1inches), sum(3npc, 1inches))
[3] max(sum(1npc, 1inches), sum(2npc, 1inches), sum(3npc, 1inches))
> rep(max(unit(1:3, "npc") + unit(1, "strwidth", "a"))*4, 3)
[1] 4*max(sum(1npc, 1strwidth), sum(2npc, 1strwidth), sum(3npc, 1strwidth))
[2] 4*max(sum(1npc, 1strwidth), sum(2npc, 1strwidth), sum(3npc, 1strwidth))
[3] 4*max(sum(1npc, 1strwidth), sum(2npc, 1strwidth), sum(3npc, 1strwidth))
> rep(unit(1:3, "npc") + unit(1, "strwidth", "a")*4, 3)
[1] sum(1npc, 4strwidth) sum(2npc, 4strwidth) sum(3npc, 4strwidth)
[4] sum(1npc, 4strwidth) sum(2npc, 4strwidth) sum(3npc, 4strwidth)
[7] sum(1npc, 4strwidth) sum(2npc, 4strwidth) sum(3npc, 4strwidth)
> 
> 
> 
> cleanEx()
> nameEx("unitType")
> ### * unitType
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: unitType
> ### Title: Return the Units of a Unit Object
> ### Aliases: unitType
> ### Keywords: dplot
> 
> ### ** Examples
> 
> u <- unit(1:5, c("cm", "mm", "in", "pt", "null"))
> 
> unitType(u)
[1] "cm"     "mm"     "inches" "points" "null"  
> unitType(unit(1, "npc"))
[1] "npc"
> unitType(unit(1:3/4, "npc"))
[1] "npc" "npc" "npc"
> unitType(unit(1:3/4, "npc") + unit(1, "inches"))
[1] "sum" "sum" "sum"
> unitType(min(unit(0.5, "npc"), unit(1, "inches")))
[1] "min"
> unitType(unit.c(unit(0.5, "npc"), unit(2, "inches") + unit(1:3/4, "npc"),
+                 unit(1, "strwidth", "hi there")))
[1] "npc"      "sum"      "sum"      "sum"      "strwidth"
> unitType(min(unit(1, "in"), unit(1, "npc") + unit(1, "mm")))
[1] "min"
> 
> unitType(u, recurse=TRUE)
$cm
[1] "cm"

$mm
[1] "mm"

$inches
[1] "inches"

$points
[1] "points"

$null
[1] "null"

> unitType(unit(1, "npc"), recurse=TRUE)
$npc
[1] "npc"

> unitType(unit(1:3/4, "npc"), recurse=TRUE)
$npc
[1] "npc"

$npc
[1] "npc"

$npc
[1] "npc"

> unitType(unit(1:3/4, "npc") + unit(1, "inches"), recurse=TRUE)
$sum
$sum$npc
[1] "npc"

$sum$inches
[1] "inches"


$sum
$sum$npc
[1] "npc"

$sum$inches
[1] "inches"


$sum
$sum$npc
[1] "npc"

$sum$inches
[1] "inches"


> unitType(min(unit(0.5, "npc"), unit(1, "inches")), recurse=TRUE)
$min
$min$npc
[1] "npc"

$min$inches
[1] "inches"


> unitType(unit.c(unit(0.5, "npc"), unit(2, "inches") + unit(1:3/4, "npc"),
+                 unit(1, "strwidth", "hi there")), recurse=TRUE)
$npc
[1] "npc"

$sum
$sum$inches
[1] "inches"

$sum$npc
[1] "npc"


$sum
$sum$inches
[1] "inches"

$sum$npc
[1] "npc"


$sum
$sum$inches
[1] "inches"

$sum$npc
[1] "npc"


$strwidth
[1] "strwidth"

> unitType(min(unit(1, "in"), unit(1, "npc") + unit(1, "mm")), recurse=TRUE)
$min
$min$inches
[1] "inches"

$min$sum
$min$sum$npc
[1] "npc"

$min$sum$mm
[1] "mm"



> unlist(unitType(min(unit(1, "in"), unit(1, "npc") + unit(1, "mm")),
+                 recurse=TRUE))
 min.inches min.sum.npc  min.sum.mm 
   "inches"       "npc"        "mm" 
> 
> 
> 
> cleanEx()
> nameEx("viewport")
> ### * viewport
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: Grid Viewports
> ### Title: Create a Grid Viewport
> ### Aliases: viewport vpList vpStack vpTree
> ### Keywords: dplot
> 
> ### ** Examples
> 
> # Diagram of a sample viewport
> grid.show.viewport(viewport(x=0.6, y=0.6,
+                    width=unit(1, "inches"), height=unit(1, "inches")))
> # Demonstrate viewport clipping
> clip.demo <- function(i, j, clip1, clip2) {
+   pushViewport(viewport(layout.pos.col=i,
+                          layout.pos.row=j))
+   pushViewport(viewport(width=0.6, height=0.6, clip=clip1))
+   grid.rect(gp=gpar(fill="white"))
+   grid.circle(r=0.55, gp=gpar(col="red", fill="pink"))
+   popViewport()
+   pushViewport(viewport(width=0.6, height=0.6, clip=clip2))
+   grid.polygon(x=c(0.5, 1.1, 0.6, 1.1, 0.5, -0.1, 0.4, -0.1),
+                y=c(0.6, 1.1, 0.5, -0.1, 0.4, -0.1, 0.5, 1.1),
+                gp=gpar(col="blue", fill="light blue"))
+   popViewport(2)
+ }
> 
> grid.newpage()
> grid.rect(gp=gpar(fill="grey"))
> pushViewport(viewport(layout=grid.layout(2, 2)))
> clip.demo(1, 1, FALSE, FALSE)
> clip.demo(1, 2, TRUE, FALSE)
> clip.demo(2, 1, FALSE, TRUE)
> clip.demo(2, 2, TRUE, TRUE)
> popViewport()
> # Demonstrate turning clipping off
> grid.newpage()
> pushViewport(viewport(width=.5, height=.5, clip="on"))
> grid.rect()
> grid.circle(r=.6, gp=gpar(lwd=10))
> pushViewport(viewport(clip="inherit"))
> grid.circle(r=.6, gp=gpar(lwd=5, col="grey"))
> pushViewport(viewport(clip="off"))
> grid.circle(r=.6)
> popViewport(3)
> # Demonstrate vpList, vpStack, and vpTree
> grid.newpage()
> tree <- vpTree(viewport(width=0.8, height=0.8, name="A"),
+                vpList(vpStack(viewport(x=0.1, y=0.1, width=0.5, height=0.5,
+                                        just=c("left", "bottom"), name="B"),
+                               viewport(x=0.1, y=0.1, width=0.5, height=0.5,
+                                        just=c("left", "bottom"), name="C"),
+                               viewport(x=0.1, y=0.1, width=0.5, height=0.5,
+                                        just=c("left", "bottom"), name="D")),
+                       viewport(x=0.5, width=0.4, height=0.9,
+                                just="left", name="E")))
> pushViewport(tree)
> for (i in LETTERS[1:5]) {
+   seekViewport(i)
+   grid.rect()
+   grid.text(current.vpTree(FALSE),
+             x=unit(1, "mm"), y=unit(1, "npc") - unit(1, "mm"),
+             just=c("left", "top"),
+             gp=gpar(fontsize=8))
+ }
> 
> 
> 
> cleanEx()
> nameEx("viewportTransform")
> ### * viewportTransform
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: viewportTransform
> ### Title: Define a Group Transformation
> ### Aliases: viewportTransform viewportTranslate viewportScale
> ###   viewportRotate defnTranslate defnScale defnRotate useTranslate
> ###   useScale useRotate groupTranslate groupScale groupRotate groupShear
> ###   groupFlip
> ### Keywords: dplot
> 
> ### ** Examples
> 
> ## NOTE: on devices without support for groups nothing will be drawn
> grid.newpage()
> ## Define and use group in same viewport
> pushViewport(viewport(width=.2, height=.2))
> grid.define(circleGrob(gp=gpar(lwd=5)), name="circle")
> grid.use("circle")
> popViewport()
> ## Use group in viewport that is translated and scaled
> pushViewport(viewport(x=.2, y=.2, width=.1, height=.1))
> grid.use("circle")
> popViewport()
> ## Use group in viewport that is translated and scaled
> ## BUT only make use of the translation
> pushViewport(viewport(x=.2, y=.8, width=.1, height=.1))
> grid.use("circle", transform=viewportTranslate)
> popViewport()
> ## Use group in viewport that is translated and scaled
> ## unevenly (distorted)
> pushViewport(viewport(x=.8, y=.7, width=.2, height=.4))
> grid.use("circle")
> popViewport()
> 
> 
> 
> cleanEx()
> nameEx("viewports")
> ### * viewports
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: Working with Viewports
> ### Title: Maintaining and Navigating the Grid Viewport Tree
> ### Aliases: pushViewport downViewport seekViewport popViewport upViewport
> ### Keywords: dplot
> 
> ### ** Examples
> 
> # push the same viewport several times
> grid.newpage()
> vp <- viewport(width=0.5, height=0.5)
> pushViewport(vp)
> grid.rect(gp=gpar(col="blue"))
> grid.text("Quarter of the device",
+   y=unit(1, "npc") - unit(1, "lines"), gp=gpar(col="blue"))
> pushViewport(vp)
> grid.rect(gp=gpar(col="red"))
> grid.text("Quarter of the parent viewport",
+   y=unit(1, "npc") - unit(1, "lines"), gp=gpar(col="red"))
> popViewport(2)
> # push several viewports then navigate amongst them
> grid.newpage()
> grid.rect(gp=gpar(col="grey"))
> grid.text("Top-level viewport",
+   y=unit(1, "npc") - unit(1, "lines"), gp=gpar(col="grey"))
> if (interactive()) Sys.sleep(1.0)
> pushViewport(viewport(width=0.8, height=0.7, name="A"))
> grid.rect(gp=gpar(col="blue"))
> grid.text("1. Push Viewport A",
+   y=unit(1, "npc") - unit(1, "lines"), gp=gpar(col="blue"))
> if (interactive()) Sys.sleep(1.0)
> pushViewport(viewport(x=0.1, width=0.3, height=0.6,
+   just="left", name="B"))
> grid.rect(gp=gpar(col="red"))
> grid.text("2. Push Viewport B (in A)",
+   y=unit(1, "npc") - unit(1, "lines"), gp=gpar(col="red"))
> if (interactive()) Sys.sleep(1.0)
> upViewport(1)
> grid.text("3. Up from B to A",
+   y=unit(1, "npc") - unit(2, "lines"), gp=gpar(col="blue"))
> if (interactive()) Sys.sleep(1.0)
> pushViewport(viewport(x=0.5, width=0.4, height=0.8,
+   just="left", name="C"))
> grid.rect(gp=gpar(col="green"))
> grid.text("4. Push Viewport C (in A)",
+   y=unit(1, "npc") - unit(1, "lines"), gp=gpar(col="green"))
> if (interactive()) Sys.sleep(1.0)
> pushViewport(viewport(width=0.8, height=0.6, name="D"))
> grid.rect()
> grid.text("5. Push Viewport D (in C)",
+   y=unit(1, "npc") - unit(1, "lines"))
> if (interactive()) Sys.sleep(1.0)
> upViewport(0)
> grid.text("6. Up from D to top-level",
+   y=unit(1, "npc") - unit(2, "lines"), gp=gpar(col="grey"))
> if (interactive()) Sys.sleep(1.0)
> downViewport("D")
> grid.text("7. Down from top-level to D",
+   y=unit(1, "npc") - unit(2, "lines"))
> if (interactive()) Sys.sleep(1.0)
> seekViewport("B")
> grid.text("8. Seek from D to B",
+   y=unit(1, "npc") - unit(2, "lines"), gp=gpar(col="red"))
> pushViewport(viewport(width=0.9, height=0.5, name="A"))
> grid.rect()
> grid.text("9. Push Viewport A (in B)",
+   y=unit(1, "npc") - unit(1, "lines"))
> if (interactive()) Sys.sleep(1.0)
> seekViewport("A")
> grid.text("10. Seek from B to A (in ROOT)",
+   y=unit(1, "npc") - unit(3, "lines"), gp=gpar(col="blue"))
> if (interactive()) Sys.sleep(1.0)
> seekViewport(vpPath("B", "A"))
> grid.text("11. Seek from\nA (in ROOT)\nto A (in B)")
> popViewport(0)
> 
> 
> 
> cleanEx()
> nameEx("vpPath")
> ### * vpPath
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: vpPath
> ### Title: Concatenate Viewport Names
> ### Aliases: vpPath
> ### Keywords: dplot
> 
> ### ** Examples
> 
> vpPath("vp1", "vp2")
vp1::vp2 
> 
> 
> 
> cleanEx()
> nameEx("xsplinePoints")
> ### * xsplinePoints
> 
> flush(stderr()); flush(stdout())
> 
> ### Name: xsplinePoints
> ### Title: Return the points that would be used to draw an Xspline (or a
> ###   Bezier curve).
> ### Aliases: xsplinePoints bezierPoints
> ### Keywords: dplot
> 
> ### ** Examples
> 
> grid.newpage()
> xsg <- xsplineGrob(c(.1, .1, .9, .9), c(.1, .9, .9, .1), shape=1)
> grid.draw(xsg)
> trace <- xsplinePoints(xsg)
> grid.circle(trace$x, trace$y, default.units="inches", r=unit(.5, "mm"))
> 
> grid.newpage()
> vp <- viewport(width=.5)
> xg <- xsplineGrob(x=c(0, .2, .4, .2, .5, .7, .9, .7),
+                   y=c(.5, 1, .5, 0, .5, 1, .5, 0),
+                   id=rep(1:2, each=4),
+                   shape=1,
+                   vp=vp)
> grid.draw(xg)
> trace <- xsplinePoints(xg)
> pushViewport(vp)
> invisible(lapply(trace, function(t) grid.lines(t$x, t$y, gp=gpar(col="red"))))
> popViewport()
> 
> grid.newpage()
> bg <- bezierGrob(c(.2, .2, .8, .8), c(.2, .8, .8, .2))
> grid.draw(bg)
> trace <- bezierPoints(bg)
> grid.circle(trace$x, trace$y, default.units="inches", r=unit(.5, "mm"))
> 
> 
> 
> ### * <FOOTER>
> ###
> cleanEx()
> options(digits = 7L)
> base::cat("Time elapsed: ", proc.time() - base::get("ptime", pos = 'CheckExEnv'),"\n")
Time elapsed:  3.471 0.055 3.552 0 0 
> grDevices::dev.off()
null device 
          1 
> ###
> ### Local variables: ***
> ### mode: outline-minor ***
> ### outline-regexp: "\\(> \\)?### [*]+" ***
> ### End: ***
> quit('no')
