R Under development (unstable) (2026-02-10 r89394) -- "Unsuffered Consequences" Copyright (C) 2026 The R Foundation for Statistical Computing Platform: aarch64-apple-darwin23.3.0 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. 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" > str(arrow(type = "closed"), give.attr=FALSE) "arrow" (pkg {grid}) object: $ angle : num 30 $ length: 'simpleUnit' num 0.25inches $ ends : int 2 $ type : int 2 > > > > 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)) > masks <- dev.capabilities()$masks > if (is.character(masks) && "luminance" %in% masks) { + mask <- as.mask(rectGrob(gp=gpar(col=NA, fill="grey50")), type="luminance") + } else { + 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() ## plotmath example > grid.text(quote(frac(e^{-x^2/2}, sqrt(2*pi))), x=x, y=y, rot=stats::runif(20, -45,45), + gp=gpar(fontsize=17, col=4), 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 is.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")) > > > > ### *