Title: | The Grid Graphics Package |
---|---|
Description: | A rewrite of the graphics layout capabilities, plus some support for interaction. |
Authors: | Paul Murrell <[email protected]> |
Maintainer: | R Core Team <[email protected]> |
License: | Part of R 4.4.1 |
Version: | 4.4.1 |
Built: | 2024-06-15 17:27:43 UTC |
Source: | base |
A rewrite of the graphics layout capabilities, plus some support for interaction.
This package contains a graphics system which supplements S-style graphics (see the graphics package).
Further information is available in the following vignettes:
grid |
Introduction to grid (../doc/grid.pdf) |
displaylist |
Display Lists in grid (../doc/displaylist.pdf) |
frame |
Frames and packing grobs (../doc/frame.pdf) |
grobs |
Working with grid grobs (../doc/grobs.pdf) |
interactive |
Editing grid Graphics (../doc/interactive.pdf) |
locndimn |
Locations versus Dimensions (../doc/locndimn.pdf) |
moveline |
Demonstrating move-to and line-to (../doc/moveline.pdf) |
nonfinite |
How grid responds to non-finite values (../doc/nonfinite.pdf) |
plotexample |
Writing grid Code (../doc/plotexample.pdf) |
rotated |
Rotated Viewports (../doc/rotated.pdf) |
saveload |
Persistent representations (../doc/saveload.pdf) |
sharing |
Modifying multiple grobs simultaneously (../doc/sharing.pdf) |
viewports |
Working with grid viewports (../doc/viewports.pdf) |
For a complete list of functions with individual help pages,
use library(help="grid")
.
Paul Murrell [email protected]
Maintainer: R Core Team [email protected]
Murrell, P. (2005). R Graphics. Chapman & Hall/CRC Press.
This function converts a unit object into absolute units.
Absolute units are unaffected, but non-absolute units are
converted into "null"
units.
absolute.size(unit)
absolute.size(unit)
unit |
An object of class |
Absolute units are things like "inches"
, "cm"
,
and "lines"
. Non-absolute units are "npc"
and "native"
.
This function is designed to be used in widthDetails
and heightDetails
methods.
An object of class "unit"
.
Paul Murrell
widthDetails
and heightDetails
methods.
Produces a description of what arrows to add to a line.
The result can be passed to a function that draws a line,
e.g., grid.lines
.
arrow(angle = 30, length = unit(0.25, "inches"), ends = "last", type = "open")
arrow(angle = 30, length = unit(0.25, "inches"), ends = "last", type = "open")
angle |
The angle of the arrow head in degrees (smaller numbers produce narrower, pointier arrows). Essentially describes the width of the arrow head. |
length |
A unit specifying the length of the arrow head (from tip to base). |
ends |
One of |
type |
One of |
arrow() str(arrow(type = "closed"), give.attr=FALSE)
arrow() str(arrow(type = "closed"), give.attr=FALSE)
Define either an alpha mask or a luminance mask, based on a grob.
as.mask(x, type=c("alpha", "luminance"))
as.mask(x, type=c("alpha", "luminance"))
x |
A grob. |
type |
The type of mask. |
A mask may be specified for a viewport either directly as a grob or using this function. In the former case, the result is an alpha mask. This function allows the user to define a luminance mask instead.
Not all graphics devices support masks and those that do
may only support one type of mask: for example
xfig
and pictex
do not support masks and
Cairo-based devices only support alpha masks.
A "GridMask"
object.
Paul Murrell
## 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))
## 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))
This function returns the ascent, descent, and width metric information for a character or expression vector.
calcStringMetric(text)
calcStringMetric(text)
text |
A character or expression vector. |
A list with three numeric components named ascent, descent, and width. All values are in inches.
The metric information from this function is based on the font settings that are in effect when this function is called. It will not necessarily correspond to the metric information of any text that is drawn on the page.
Paul Murrell
stringAscent
, stringDescent
,
grobAscent
, and grobDescent
.
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() }
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() }
This is a convenience function for producing a viewport with x- and/or y-scales based on numeric values passed to the function.
dataViewport(xData = NULL, yData = NULL, xscale = NULL, yscale = NULL, extension = 0.05, ...)
dataViewport(xData = NULL, yData = NULL, xscale = NULL, yscale = NULL, extension = 0.05, ...)
xData |
A numeric vector of data. |
yData |
A numeric vector of data. |
xscale |
A numeric vector (length 2). |
yscale |
A numeric vector (length 2). |
extension |
A numeric. If length greater than 1, then first value is used to extend the xscale and second value is used to extend the yscale. |
... |
All other arguments will be passed to a call to
the |
If xscale
is not specified then the values in x
are
used to generate an x-scale based on the range of x
, extended
by the proportion specified in extension
. Similarly for the
y-scale.
A grid viewport object.
Paul Murrell
viewport
and
plotViewport
.
Determine the number of levels in a viewport stack or tree, in a viewport path, or in a grob path.
depth(x, ...) ## S3 method for class 'viewport' depth(x, ...) ## S3 method for class 'path' depth(x, ...)
depth(x, ...) ## S3 method for class 'viewport' depth(x, ...) ## S3 method for class 'path' depth(x, ...)
x |
Typically a viewport or viewport stack or viewport tree or viewport list, or a viewport path, or a grob path. |
... |
Arguments used by other methods. |
Depths of paths are pretty straightforward because they contain no branchings. The depth of a viewport stack is the sum of the depths of the components of the stack. The depth of a viewport tree is the depth of the parent plus the depth of the children. The depth of a viewport list is the depth of the last component of the list.
An integer value.
vp <- viewport() depth(vp) depth(vpStack(vp, vp)) depth(vpList(vpStack(vp, vp), vp)) depth(vpPath("vp")) depth(vpPath("vp1", "vp2"))
vp <- viewport() depth(vp) depth(vpStack(vp, vp)) depth(vpList(vpStack(vp, vp), vp)) depth(vpPath("vp")) depth(vpPath("vp1", "vp2"))
These functions take a pair of unit objects and convert them to a pair of device locations (or dimensions) in inches (or native device coordinates).
deviceLoc(x, y, valueOnly = FALSE, device = FALSE) deviceDim(w, h, valueOnly = FALSE, device = FALSE)
deviceLoc(x, y, valueOnly = FALSE, device = FALSE) deviceDim(w, h, valueOnly = FALSE, device = FALSE)
x , y , w , h
|
A unit object. |
valueOnly |
A logical indicating. If |
device |
A logical indicating whether the returned values should be in inches or native device units. |
These functions differ from the functions like convertX()
because they convert from the coordinate systems within a viewport
to inches on the device (i.e., from one viewport to another) and
because they only deal with pairs of values (locations or dimensions).
The functions like convertX()
convert between different units within
the same viewport and convert along a single dimension.
A list with two components, both of which are unit object in inches
(unless valueOnly
is TRUE
in which case
both components are numeric).
The conversion is only valid for the current device size. If the device is resized then at least some conversions will become invalid.
Furthermore, the returned value only makes sense with respect to the entire device (i.e., within the context of the root viewport).
Paul Murrell
## A tautology grid.newpage() pushViewport(viewport()) deviceLoc(unit(1, "inches"), unit(1, "inches")) ## 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 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 upViewport() grid.circle(loc$x, loc$y, r=unit(1, "mm"), gp=gpar(fill="black"))
## A tautology grid.newpage() pushViewport(viewport()) deviceLoc(unit(1, "inches"), unit(1, "inches")) ## 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 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 upViewport() grid.circle(loc$x, loc$y, r=unit(1, "mm"), gp=gpar(fill="black"))
These generic hook functions are called whenever a grid grob is drawn. They provide an opportunity for customising the drawing of a new class derived from grob (or gTree).
drawDetails(x, recording) preDrawDetails(x) postDrawDetails(x)
drawDetails(x, recording) preDrawDetails(x) postDrawDetails(x)
x |
A grid grob. |
recording |
A logical value indicating whether a grob is being added to the display list or redrawn from the display list. |
NOTE: these functions have been largely superceded by the
makeContent
and makeContext
functions,
though they are still run and may still be useful in some contexts.
These functions are called by the grid.draw
methods for grobs
and gTrees.
preDrawDetails
is called first during the drawing of a grob.
This is where any additional viewports should be pushed. Note that
the default behaviour for grobs is to push any viewports in the
vp
slot, and for gTrees is to also push and up any viewports in the
childrenvp
slot so there is typically nothing to do here.
drawDetails
is called next and is where any additional
calculations and graphical output should occur.
Note that the default behaviour
for gTrees is to draw all grobs in the children
slot
so there is typically nothing to do here.
postDrawDetails
is called last and should reverse anything
done in preDrawDetails
(i.e., pop or up any viewports that were
pushed). Note that the
default behaviour for grobs is to pop any viewports that were pushed
so there is typically nothing to do here.
Note that preDrawDetails
and postDrawDetails
are
also called in the calculation of "grobwidth"
and
"grobheight"
units.
None of these functions are expected to return a value.
Paul Murrell
"Changes to grid for R 3.0.0", Paul Murrell, The R Journal (2013) 5:2, pages 148-160.
grid.draw
and makeContent
This generic hook function is called whenever a grid grob is edited
via grid.edit
or editGrob
.
This provides an opportunity for customising the editing of a
new class derived from grob (or gTree).
editDetails(x, specs)
editDetails(x, specs)
x |
A grid grob. |
specs |
A list of named elements. The names indicate the grob slots to modify and the values are the new values for the slots. |
This function is called by grid.edit
and editGrob
.
A method should be written for classes derived from grob or gTree
if a change in a slot has an effect on other slots in the grob or
children of a gTree (e.g., see grid:::editDetails.xaxis
).
Note that the slot already has the new value.
The function MUST return the modified grob.
Paul Murrell
This is a convenience function for producing a new viewport from a copy of an existing viewport (by default the current viewport), with specified modifications.
editViewport(vp=current.viewport(), ...)
editViewport(vp=current.viewport(), ...)
vp |
A viewport object. |
... |
Modification of the viewport
(should all be valid arguments to
the |
A grid viewport object.
Paul Murrell
Explode a viewport path or grob path into its components.
explode(x) ## S3 method for class 'character' explode(x) ## S3 method for class 'path' explode(x)
explode(x) ## S3 method for class 'character' explode(x) ## S3 method for class 'path' explode(x)
x |
Typically a viewport path or a grob path, but a character vector containing zero or more path separators may also be given. |
A character vector.
explode("vp1::vp2") explode(vpPath("vp1", "vp2"))
explode("vp1::vp2") explode(vpPath("vp1", "vp2"))
The functions gEdit
and gEditList
create
objects representing an edit operation (essentially a list
of arguments to editGrob
).
The functions applyEdit
and applyEdits
apply
one or more edit operations to a graphical object.
These functions are most useful for developers creating new graphical functions and objects.
gEdit(...) gEditList(...) applyEdit(x, edit) applyEdits(x, edits)
gEdit(...) gEditList(...) applyEdit(x, edit) applyEdits(x, edits)
... |
one or more arguments to the |
x |
a grob (grid graphical object). |
edit |
a |
edits |
either a |
gEdit
returns an object of class "gEdit"
.
gEditList
returns an object of class "gEditList"
.
applyEdit
and applyEditList
return the modified grob.
Paul Murrell
grid.rect(gp=gpar(col="red")) # same thing, but more verbose grid.draw(applyEdit(rectGrob(), gEdit(gp=gpar(col="red"))))
grid.rect(gp=gpar(col="red")) # same thing, but more verbose grid.draw(applyEdit(rectGrob(), gEdit(gp=gpar(col="red"))))
Returns a character vector containing the names of all top-level grobs on the display list.
getNames()
getNames()
A character vector.
Paul Murrell
grid.grill() getNames()
grid.grill() getNames()
gpar()
should be used to create a set of graphical
parameter settings. It returns an object of class "gpar"
. This is
basically a list of name-value pairs.
get.gpar()
can be used to query the current
graphical parameter settings.
gpar(...) get.gpar(names = NULL)
gpar(...) get.gpar(names = NULL)
... |
Any number of named arguments. |
names |
A character vector of valid graphical parameter names. |
All grid viewports and (predefined) graphical objects have a slot
called gp
, which contains a "gpar"
object. When
a viewport is pushed onto the viewport stack and when a graphical object
is drawn, the settings in the "gpar"
object are enforced.
In this way, the graphical output is modified by the gp
settings until the graphical object has finished drawing, or until the
viewport is popped off the viewport stack, or until some other
viewport or graphical object is pushed or begins drawing.
The default parameter settings are defined by the ROOT viewport, which
takes its settings from the graphics device. These defaults may
differ between devices (e.g., the default fill
setting is
different for a PNG device compared to a PDF device).
Valid parameter names are:
col |
Colour for lines and borders. |
fill |
Colour for filling rectangles, polygons, ... |
alpha |
Alpha channel for transparency |
lty |
Line type |
lwd |
Line width |
lex |
Multiplier applied to line width |
lineend |
Line end style (round, butt, square) |
linejoin |
Line join style (round, mitre, bevel) |
linemitre |
Line mitre limit (number greater than 1) |
fontsize |
The size of text (in points) |
cex |
Multiplier applied to fontsize |
fontfamily |
The font family |
fontface |
The font face (bold, italic, ...) |
lineheight |
The height of a line as a multiple of the size of text |
font |
Font face (alias for fontface ; for backward compatibility) |
For more details of many of these, see the help for the corresponding
graphical parameter par
in base graphics. (This may
have a slightly different name, e.g. lend
, ljoin
,
lmitre
, family
.)
Colours can be specified in one of the forms returned by
rgb
, as a name (see colors
) or as a
non-negative integer index into the current palette (with zero
being taken as transparent). (Negative integer values are now an
error.)
The alpha
setting is combined with the alpha channel for
individual colours by multiplying (with both alpha settings
normalised to the range 0 to 1).
The fill
setting can also be a linear gradient or a radial
gradient or a pattern (see patterns).
The size of text is fontsize
*cex
. The size of a line
is fontsize
*cex
*lineheight
.
The cex
setting is cumulative; if a viewport is pushed
with a cex
of 0.5 then another viewport is pushed with a
cex
of 0.5, the effective cex
is 0.25.
The alpha
and lex
settings are also cumulative.
Changes to the fontfamily
may be ignored by some devices,
but is supported by PostScript, PDF, X11, Windows, and Quartz. The
fontfamily
may be used to specify one
of the Hershey Font families (e.g., HersheySerif
)
and this specification will be honoured
on all devices.
The specification of fontface
can be an integer or a string.
If an integer, then it
follows the R base graphics
standard: 1 = plain, 2 = bold, 3 = italic, 4 = bold italic.
If a string, then valid values are: "plain"
,
"bold"
, "italic"
, "oblique"
, and
"bold.italic"
.
For the special case of the HersheySerif font family,
"cyrillic"
, "cyrillic.oblique"
, and "EUC"
are also available.
All parameter values can be vectors of multiple values. (This will not always make sense – for example, viewports will only take notice of the first parameter value.)
get.gpar()
returns all current graphical parameter settings.
An object of class "gpar"
.
Paul Murrell
gp <- get.gpar() utils::str(gp) ## These *do* nothing but produce a "gpar" object: gpar(col = "red") gpar(col = "blue", lty = "solid", lwd = 3, fontsize = 16) get.gpar(c("col", "lty")) 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()
gp <- get.gpar() utils::str(gp) ## These *do* nothing but produce a "gpar" object: gpar(col = "red") gpar(col = "blue", lty = "solid", lwd = 3, fontsize = 16) get.gpar(c("col", "lty")) 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()
This function can be used to generate a grob path for use
in grid.edit
and friends.
A grob path is a list of nested grob names.
gPath(...)
gPath(...)
... |
Character values which are grob names. |
Grob names must only be unique amongst grobs which share the same parent in a gTree.
This function can be used to generate a specification for a grob that includes the grob's parent's name (and the name of its parent and so on).
For interactive use, it is possible to directly specify a path, but it is strongly recommended that this function is used otherwise in case the path separator is changed in future versions of grid.
A gPath
object.
grob
,
editGrob
,
addGrob
,
removeGrob
,
getGrob
,
setGrob
gPath("g1", "g2")
gPath("g1", "g2")
General information about the grid graphics package.
Grid graphics provides an alternative to the standard R graphics. The user is able to define arbitrary rectangular regions (called viewports) on the graphics device and define a number of coordinate systems for each region. Drawing can be specified to occur in any viewport using any of the available coordinate systems.
Grid graphics and standard R graphics do not mix!
Type library(help = grid)
to see a list of (public)
Grid graphics functions.
Paul Murrell
viewport
,
grid.layout
, and
unit
.
## 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))
## 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))
These functions create viewports, which describe rectangular regions on a graphics device and define a number of coordinate systems within those regions.
viewport(x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), default.units = "npc", just = "centre", gp = gpar(), clip = "inherit", mask = "inherit", xscale = c(0, 1), yscale = c(0, 1), angle = 0, layout = NULL, layout.pos.row = NULL, layout.pos.col = NULL, name = NULL) vpList(...) vpStack(...) vpTree(parent, children)
viewport(x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), default.units = "npc", just = "centre", gp = gpar(), clip = "inherit", mask = "inherit", xscale = c(0, 1), yscale = c(0, 1), angle = 0, layout = NULL, layout.pos.row = NULL, layout.pos.col = NULL, name = NULL) vpList(...) vpStack(...) vpTree(parent, children)
x |
A numeric vector or unit object specifying x-location. |
y |
A numeric vector or unit object specifying y-location. |
width |
A numeric vector or unit object specifying width. |
height |
A numeric vector or unit object specifying height. |
default.units |
A string indicating the default units to use
if |
just |
A string or numeric
vector specifying the justification of the viewport
relative to its (x, y) location. If there are two values, the first
value specifies horizontal justification and the second value specifies
vertical justification. Possible string values are: |
gp |
An object of class |
clip |
One of May also be a grob (or a gTree) that describes a clipping path
or the result of a call to |
mask |
One of |
xscale |
A numeric vector of length two indicating the minimum and maximum on the x-scale. The limits may not be identical. |
yscale |
A numeric vector of length two indicating the minimum and maximum on the y-scale. The limits may not be identical. |
angle |
A numeric value indicating the angle of rotation of the viewport. Positive values indicate the amount of rotation, in degrees, anticlockwise from the positive x-axis. |
layout |
A Grid layout object which splits the viewport into subregions. |
layout.pos.row |
A numeric vector giving the rows occupied by this viewport in its parent's layout. |
layout.pos.col |
A numeric vector giving the columns occupied by this viewport in its parent's layout. |
name |
A character value to uniquely identify the viewport once it has been pushed onto the viewport tree. |
... |
Any number of grid viewport objects. |
parent |
A grid viewport object. |
children |
A vpList object. |
The location and size of a viewport are relative to the coordinate
systems defined by the viewport's parent (either a graphical device
or another viewport). The location and size can be specified in a
very flexible way by specifying them with unit objects.
When specifying the location of a viewport, specifying
both layout.pos.row
and layout.pos.col
as NULL
indicates that
the viewport ignores its parent's layout and specifies its own
location and size (via its locn
). If only one of
layout.pos.row
and layout.pos.col
is NULL
, this
means occupy ALL of the appropriate row(s)/column(s). For example,
layout.pos.row = 1
and layout.pos.col = NULL
means
occupy all of row 1. Specifying non-NULL
values for both
layout.pos.row
and layout.pos.col
means occupy the
intersection of the appropriate rows and columns. If a vector of
length two is
specified for layout.pos.row
or layout.pos.col
, this
indicates a range of rows or columns to occupy. For example,
layout.pos.row = c(1, 3)
and layout.pos.col = c(2, 4)
means occupy cells in the intersection of rows 1, 2, and 3, and
columns, 2, 3, and 4.
Clipping obeys only the most recent viewport clip setting. For example, if you clip to viewport1, then clip to viewport2, the clipping region is determined wholly by viewport2, the size and shape of viewport1 is irrelevant (until viewport2 is popped of course).
If a viewport is rotated (because of its own angle
setting
or because it is within another viewport which is rotated) then
the clip
flag is ignored.
If clip
is a grob, then that grob (which may be more
than one shape) defines a clipping path. The function
as.path
may be used to specify a fill rule for the path.
Viewport names need not be unique. When pushed, viewports
sharing the same parent must have unique names, which means that
if you push a viewport with the same name as an existing viewport,
the existing viewport will be replaced in the viewport tree.
A viewport name can be any string, but
grid uses the
reserved name "ROOT"
for the top-level viewport. Also,
when specifying a viewport name in downViewport
and seekViewport
, it is possible to provide a viewport
path, which consists of several names concatenated using the
separator (currently ::
). Consequently, it is not
advisable to use this separator in viewport names.
The viewports in a vpList
are pushed in parallel. The
viewports in a vpStack
are pushed in series. When a
vpTree
is pushed, the parent is pushed first, then the
children are pushed in parallel.
An R object of class viewport
.
Paul Murrell
Grid,
pushViewport
,
popViewport
,
downViewport
,
seekViewport
,
upViewport
,
unit
,
grid.layout
,
grid.show.layout
.
# 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)) }
# 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)) }
Add a grob to a gTree or a descendant of a gTree.
grid.add(gPath, child, strict = FALSE, grep = FALSE, global = FALSE, allDevices = FALSE, redraw = TRUE) addGrob(gTree, child, gPath = NULL, strict = FALSE, grep = FALSE, global = FALSE, warn = TRUE) setChildren(x, children)
grid.add(gPath, child, strict = FALSE, grep = FALSE, global = FALSE, allDevices = FALSE, redraw = TRUE) addGrob(gTree, child, gPath = NULL, strict = FALSE, grep = FALSE, global = FALSE, warn = TRUE) setChildren(x, children)
gTree , x
|
A gTree object. |
gPath |
A gPath object. For |
child |
A grob object. |
children |
A gList object. |
strict |
A boolean indicating whether the gPath must be matched exactly. |
grep |
A boolean indicating whether the |
global |
A boolean indicating whether the function should affect
just the first match of the |
warn |
A logical to indicate whether failing to find the specified gPath should trigger an error. |
allDevices |
A boolean indicating whether all open devices should be searched for matches, or just the current device. NOT YET IMPLEMENTED. |
redraw |
A logical value to indicate whether to redraw the grob. |
addGrob
copies the specified grob and returns a modified
grob.
grid.add
destructively modifies a grob on the display list.
If redraw
is TRUE
it then redraws everything to reflect the change.
setChildren
is a basic function for setting all children
of a gTree at once (instead of repeated calls to addGrob
).
addGrob
returns a grob object; grid.add
returns NULL
.
Paul Murrell
grob
, getGrob
,
addGrob
, removeGrob
.
These functions create and draw Bezier Curves (a curve drawn relative to 4 control points).
grid.bezier(...) bezierGrob(x = c(0, 0.5, 1, 0.5), y = c(0.5, 1, 0.5, 0), id = NULL, id.lengths = NULL, default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), vp = NULL)
grid.bezier(...) bezierGrob(x = c(0, 0.5, 1, 0.5), y = c(0.5, 1, 0.5, 0), id = NULL, id.lengths = NULL, default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), vp = NULL)
x |
A numeric vector or unit object specifying x-locations of spline control points. |
y |
A numeric vector or unit object specifying y-locations of spline control points. |
id |
A numeric vector used to separate locations in |
id.lengths |
A numeric vector used to separate locations in |
default.units |
A string indicating the default units to use
if |
arrow |
A list describing arrow heads to place at either end
of the bezier, as produced by the |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
... |
Arguments to be passed to |
Both functions create a beziergrob (a graphical object describing a
Bezier curve), but only grid.bezier
draws the Bezier curve.
A Bezier curve is a line drawn relative to 4 control points.
Missing values are not allowed for x
and y
(i.e., it is not valid for a control point to be missing).
The curve is currently drawn using an approximation based on X-splines.
A grob object.
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))
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))
Capture the current contents of a graphics device as a raster (bitmap) image.
grid.cap()
grid.cap()
This function is only implemented for on-screen graphics devices.
A matrix of R colour names, or NULL
if not available.
Paul Murrell
dev.capabilities
to see if it is supported.
dev.new(width=0.5, height=0.5) grid.rect() grid.text("hi") cap <- grid.cap() dev.off() if(!is.null(cap)) grid.raster(cap, width=0.5, height=0.5, interpolate=FALSE)
dev.new(width=0.5, height=0.5) grid.rect() grid.text("hi") cap <- grid.cap() dev.off() if(!is.null(cap)) grid.raster(cap, width=0.5, height=0.5, interpolate=FALSE)
Functions to create and draw a circle.
grid.circle(x=0.5, y=0.5, r=0.5, default.units="npc", name=NULL, gp=gpar(), draw=TRUE, vp=NULL) circleGrob(x=0.5, y=0.5, r=0.5, default.units="npc", name=NULL, gp=gpar(), vp=NULL)
grid.circle(x=0.5, y=0.5, r=0.5, default.units="npc", name=NULL, gp=gpar(), draw=TRUE, vp=NULL) circleGrob(x=0.5, y=0.5, r=0.5, default.units="npc", name=NULL, gp=gpar(), vp=NULL)
x |
A numeric vector or unit object specifying x-locations. |
y |
A numeric vector or unit object specifying y-locations. |
r |
A numeric vector or unit object specifying radii. |
default.units |
A string indicating the default units to use
if |
name |
A character identifier. |
gp |
An object of class |
draw |
A logical value indicating whether graphics output should be produced. |
vp |
A Grid viewport object (or NULL). |
Both functions create a circle grob (a graphical object describing a
circle), but only grid.circle()
draws the circle (and then only if draw
is TRUE
).
The radius may be given in any
units; if the units are relative (e.g., "npc"
or
"native"
) then the radius will be different depending on
whether it is interpreted as a width or as a height. In such cases,
the smaller of these two values will be the result. To see the
effect, type grid.circle()
and adjust the size of the window.
What happens for very small radii is device-dependent: the circle may become invisible or be shown at a fixed minimum size. Circles of zero radius will not be plotted.
A circle grob. grid.circle()
returns the value invisibly.
Negative values for the radius are silently converted to their absolute value.
Paul Murrell
These functions set the clipping region within the current viewport without altering the current coordinate system.
grid.clip(...) clipGrob(x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", name = NULL, vp = NULL)
grid.clip(...) clipGrob(x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", name = NULL, vp = NULL)
x |
A numeric vector or unit object specifying x-location. |
y |
A numeric vector or unit object specifying y-location. |
width |
A numeric vector or unit object specifying width. |
height |
A numeric vector or unit object specifying height. |
just |
The justification of the clip rectangle
relative to its (x, y) location. If there are two values, the first
value specifies horizontal justification and the second value specifies
vertical justification. Possible string values are: |
hjust |
A numeric vector specifying horizontal justification.
If specified, overrides the |
vjust |
A numeric vector specifying vertical justification.
If specified, overrides the |
default.units |
A string indicating the default units to use
if |
name |
A character identifier. |
vp |
A Grid viewport object (or NULL). |
... |
Arguments passed to |
Both functions create a clip rectangle (a graphical object describing
a clip rectangle), but only grid.clip
enforces the clipping.
Pushing or popping a viewport always overrides the clip region set by a clip grob, regardless of whether that viewport explicitly enforces a clipping region.
clipGrob
returns a clip grob.
Paul Murrell
# 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"))
# 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"))
These functions take a unit object and convert it to an equivalent unit object in a different coordinate system.
convertX(x, unitTo, valueOnly = FALSE) convertY(x, unitTo, valueOnly = FALSE) convertWidth(x, unitTo, valueOnly = FALSE) convertHeight(x, unitTo, valueOnly = FALSE) convertUnit(x, unitTo, axisFrom = "x", typeFrom = "location", axisTo = axisFrom, typeTo = typeFrom, valueOnly = FALSE)
convertX(x, unitTo, valueOnly = FALSE) convertY(x, unitTo, valueOnly = FALSE) convertWidth(x, unitTo, valueOnly = FALSE) convertHeight(x, unitTo, valueOnly = FALSE) convertUnit(x, unitTo, axisFrom = "x", typeFrom = "location", axisTo = axisFrom, typeTo = typeFrom, valueOnly = FALSE)
x |
A unit object. |
unitTo |
The coordinate system to convert the unit to.
See the |
axisFrom |
Either |
typeFrom |
Either |
axisTo |
Same as |
typeTo |
Same as |
valueOnly |
A logical indicating. If |
The convertUnit
function allows for general-purpose
conversions. The other four functions are just more convenient
front-ends to it for the most common conversions.
The conversions occur within the current viewport.
It is not currently possible to convert to all valid coordinate systems
(e.g., "strwidth"
or "grobwidth"
). I'm not sure if all of these
are impossible, they just seem implausible at this stage.
In normal usage of grid, these functions should not be necessary.
If you want to express a location or dimension in inches rather
than user coordinates then you should simply do something like
unit(1, "inches")
rather than something like
unit(0.134, "native")
.
In some cases, however, it is necessary for the user to perform calculations on a unit value and this function becomes necessary. In such cases, please take note of the warning below.
A unit object in the specified coordinate system
(unless valueOnly
is TRUE
in which case
the returned value is a numeric).
The conversion is only valid for the current device size.
If the device is resized then at least some conversions will
become invalid. For example, suppose that I create a unit
object as follows: oneinch <- convertUnit(unit(1, "inches"),
"native")
. Now if I resize the device, the unit object in
oneinch
no longer corresponds to a physical length of 1 inch.
Paul Murrell
## A tautology convertX(unit(1, "inches"), "inches") ## The physical units convertX(unit(2.54, "cm"), "inches") convertX(unit(25.4, "mm"), "inches") convertX(unit(72.27, "points"), "inches") convertX(unit(1/12*72.27, "picas"), "inches") convertX(unit(72, "bigpts"), "inches") convertX(unit(1157/1238*72.27, "dida"), "inches") convertX(unit(1/12*1157/1238*72.27, "cicero"), "inches") convertX(unit(65536*72.27, "scaledpts"), "inches") convertX(unit(1/2.54, "inches"), "cm") convertX(unit(1/25.4, "inches"), "mm") convertX(unit(1/72.27, "inches"), "points") convertX(unit(1/(1/12*72.27), "inches"), "picas") convertX(unit(1/72, "inches"), "bigpts") convertX(unit(1/(1157/1238*72.27), "inches"), "dida") convertX(unit(1/(1/12*1157/1238*72.27), "inches"), "cicero") convertX(unit(1/(65536*72.27), "inches"), "scaledpts") 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") convertHeight(unit(2, "native"), "inches") ## From "x" to "y" (the conversion is via "inches") convertUnit(unit(1, "native"), "native", axisFrom="x", axisTo="y") ## Convert several values at once convertX(unit(c(0.5, 2.54), c("npc", "cm")), c("inches", "native")) popViewport() ## Convert a complex unit convertX(unit(1, "strwidth", "Hello"), "native")
## A tautology convertX(unit(1, "inches"), "inches") ## The physical units convertX(unit(2.54, "cm"), "inches") convertX(unit(25.4, "mm"), "inches") convertX(unit(72.27, "points"), "inches") convertX(unit(1/12*72.27, "picas"), "inches") convertX(unit(72, "bigpts"), "inches") convertX(unit(1157/1238*72.27, "dida"), "inches") convertX(unit(1/12*1157/1238*72.27, "cicero"), "inches") convertX(unit(65536*72.27, "scaledpts"), "inches") convertX(unit(1/2.54, "inches"), "cm") convertX(unit(1/25.4, "inches"), "mm") convertX(unit(1/72.27, "inches"), "points") convertX(unit(1/(1/12*72.27), "inches"), "picas") convertX(unit(1/72, "inches"), "bigpts") convertX(unit(1/(1157/1238*72.27), "inches"), "dida") convertX(unit(1/(1/12*1157/1238*72.27), "inches"), "cicero") convertX(unit(1/(65536*72.27), "inches"), "scaledpts") 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") convertHeight(unit(2, "native"), "inches") ## From "x" to "y" (the conversion is via "inches") convertUnit(unit(1, "native"), "native", axisFrom="x", axisTo="y") ## Convert several values at once convertX(unit(c(0.5, 2.54), c("npc", "cm")), c("inches", "native")) popViewport() ## Convert a complex unit convertX(unit(1, "strwidth", "Hello"), "native")
This function is redundant and will disappear in future versions.
grid.copy(grob)
grid.copy(grob)
grob |
A grob object. |
A copy of the grob object.
Paul Murrell
These functions create and draw a curve from one location to another.
grid.curve(...) curveGrob(x1, y1, x2, y2, default.units = "npc", curvature = 1, angle = 90, ncp = 1, shape = 0.5, square = TRUE, squareShape = 1, inflect = FALSE, arrow = NULL, open = TRUE, debug = FALSE, name = NULL, gp = gpar(), vp = NULL) arcCurvature(theta)
grid.curve(...) curveGrob(x1, y1, x2, y2, default.units = "npc", curvature = 1, angle = 90, ncp = 1, shape = 0.5, square = TRUE, squareShape = 1, inflect = FALSE, arrow = NULL, open = TRUE, debug = FALSE, name = NULL, gp = gpar(), vp = NULL) arcCurvature(theta)
x1 |
A numeric vector or unit object specifying the x-location of the start point. |
y1 |
A numeric vector or unit object specifying the y-location of the start point. |
x2 |
A numeric vector or unit object specifying the x-location of the end point. |
y2 |
A numeric vector or unit object specifying the y-location of the end point. |
default.units |
A string indicating the default units to use
if |
curvature |
A numeric value giving the amount of curvature. Negative values produce left-hand curves, positive values produce right-hand curves, and zero produces a straight line. |
angle |
A numeric value between 0 and 180, giving an amount to skew the control points of the curve. Values less than 90 skew the curve towards the start point and values greater than 90 skew the curve towards the end point. |
ncp |
The number of control points used to draw the curve. More control points creates a smoother curve. |
shape |
A numeric vector of values between -1 and 1, which
control the shape of the curve relative to its control points.
See |
square |
A logical value that controls whether control
points for the curve are created city-block fashion or
obliquely. When |
squareShape |
A |
inflect |
A logical value specifying whether the curve should be cut in half and inverted (see Examples below). |
arrow |
A list describing arrow heads to place at either end
of the curve, as produced by the |
open |
A logical value indicating whether to close the curve (connect the start and end points). |
debug |
A logical value indicating whether debugging information should be drawn. |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
... |
Arguments to be passed to |
theta |
An angle (in degrees). |
Both functions create a curve grob (a graphical object describing an
curve), but only grid.curve
draws the curve.
The arcCurvature
function can be used to calculate a
curvature
such that control points are generated on
an arc corresponding to angle theta
. This is typically
used in conjunction with a large ncp
to produce a curve
corresponding to the desired arc.
A grob object.
Grid,
viewport
,
grid.xspline
,
arrow
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)
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)
Evaluates an expression that includes both calculations and generating a grob that depends on the calculations so that both the calculations and the grob generation will be rerun when the scene is redrawn (e.g., device resize or editing).
Intended only for expert use.
delayGrob(expr, list, name=NULL, gp=NULL, vp=NULL) grid.delay(expr, list, name=NULL, gp=NULL, vp=NULL)
delayGrob(expr, list, name=NULL, gp=NULL, vp=NULL) grid.delay(expr, list, name=NULL, gp=NULL, vp=NULL)
expr |
object of mode |
list |
a list defining the environment in which |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
A grob is created of special class "delayedgrob"
(and drawn, in the case of grid.delay
).
The makeContent
method for this class
evaluates the expression with the list as the evaluation
environment (and the grid Namespace as the parent of that
environment).
The expr
argument should return a grob as its result.
These functions are analogues of the grid.record()
and recordGrob()
functions; the difference is that
these functions are based on the makeContent()
hook,
while those functions are based on the drawDetails()
hook.
This function must be used instead of the
function recordGraphics
; all of the dire warnings
about using recordGraphics
responsibly also apply here.
Paul Murrell
grid.delay({ w <- convertWidth(unit(1, "inches"), "npc") rectGrob(width=w) }, list())
grid.delay({ w <- convertWidth(unit(1, "inches"), "npc") rectGrob(width=w) }, list())
Turn the Grid display list on or off.
grid.display.list(on=TRUE) engine.display.list(on=TRUE)
grid.display.list(on=TRUE) engine.display.list(on=TRUE)
on |
A logical value to indicate whether the display list should be on or off. |
All drawing and viewport-setting operations are (by default) recorded in the Grid display list. This allows redrawing to occur following an editing operation.
This display list could get very large so it may be useful to turn it off in some cases; this will of course disable redrawing.
All graphics output is also recorded on the main display list of the R graphics engine (by default). This supports redrawing following a device resize and allows copying between devices.
Turning off this display list means that grid will redraw from its own display list for device resizes and copies. This will be slower than using the graphics engine display list.
None.
Turning the display list on causes the display list to be erased!
Turning off both the grid display list and the graphics engine display list will result in no redrawing whatsoever.
Paul Murrell
Call a function on each element of the current display list.
grid.DLapply(FUN, ...)
grid.DLapply(FUN, ...)
FUN |
A function; the first argument to this function is passed each element of the display list. |
... |
Further arguments to pass to |
This function is insanely dangerous (for the grid display list).
Two token efforts are made to try to avoid ending up with complete garbage on the display list:
The display list is only replaced once all new elements have been generated (so an error during generation does not result in a half-finished display list).
All new elements must be either NULL
or inherit from
the class of the element that they are replacing.
The side effect of these functions is usually to modify the grid display list.
Grid.
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 }) grid.refresh()
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 }) grid.refresh()
Produces graphical output from a graphical object.
grid.draw(x, recording=TRUE)
grid.draw(x, recording=TRUE)
x |
An object of class |
recording |
A logical value to indicate whether the drawing operation should be recorded on the Grid display list. |
This is a generic function with methods for grob and gTree objects.
The grob and gTree methods automatically push any viewports in a
vp
slot and automatically apply any gpar
settings
in a gp
slot. In addition, the gTree method pushes and
ups any viewports in a childrenvp
slot and automatically
calls grid.draw
for any grobs in a children
slot.
The methods for grob and gTree call the generic hook functions
preDrawDetails
, drawDetails
, and postDrawDetails
to allow classes derived from grob or gTree to perform
additional viewport pushing/popping and produce additional
output beyond the default behaviour for grobs and gTrees.
None.
Paul Murrell
grob
.
grid.newpage() ## Create a graphical object, but don't draw it l <- linesGrob() ## Draw it grid.draw(l)
grid.newpage() ## Create a graphical object, but don't draw it l <- linesGrob() ## Draw it grid.draw(l)
Changes the value of one of the slots of a grob and redraws the grob.
grid.edit(gPath, ..., strict = FALSE, grep = FALSE, global = FALSE, allDevices = FALSE, redraw = TRUE) grid.gedit(..., grep = TRUE, global = TRUE) editGrob(grob, gPath = NULL, ..., strict = FALSE, grep = FALSE, global = FALSE, warn = TRUE)
grid.edit(gPath, ..., strict = FALSE, grep = FALSE, global = FALSE, allDevices = FALSE, redraw = TRUE) grid.gedit(..., grep = TRUE, global = TRUE) editGrob(grob, gPath = NULL, ..., strict = FALSE, grep = FALSE, global = FALSE, warn = TRUE)
grob |
A grob object. |
... |
Zero or more named arguments specifying new slot values. |
gPath |
A gPath object. For |
strict |
A boolean indicating whether the gPath must be matched exactly. |
grep |
A boolean indicating whether the |
global |
A boolean indicating whether the function should affect
just the first match of the |
warn |
A logical to indicate whether failing to find the specified gPath should trigger an error. |
allDevices |
A boolean indicating whether all open devices should be searched for matches, or just the current device. NOT YET IMPLEMENTED. |
redraw |
A logical value to indicate whether to redraw the grob. |
editGrob
copies the specified grob and returns a modified
grob.
grid.edit
destructively modifies a grob on the display list.
If redraw
is TRUE
it then redraws everything to reflect the change.
Both functions call editDetails
to allow a grob to perform
custom actions and validDetails
to check that the modified grob
is still coherent.
grid.gedit
(g
for global) is just a convenience wrapper for
grid.edit
with different defaults.
editGrob
returns a grob object; grid.edit
returns NULL
.
Paul Murrell
grob
, getGrob
,
addGrob
, removeGrob
.
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"))) grid.edit("xa", at = 1:4/5) # Now it should work try(grid.edit(gPath("xa", "ticks"), gp = gpar(col="green")))
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"))) grid.edit("xa", at = 1:4/5) # Now it should work try(grid.edit(gPath("xa", "ticks"), gp = gpar(col="green")))
Some grobs only generate their content to draw at drawing time; this function replaces such grobs with their at-drawing-time content.
grid.force(x, ...) ## Default S3 method: grid.force(x, redraw = FALSE, ...) ## S3 method for class 'gPath' grid.force(x, strict = FALSE, grep = FALSE, global = FALSE, redraw = FALSE, ...) ## S3 method for class 'grob' grid.force(x, draw = FALSE, ...) forceGrob(x) grid.revert(x, ...) ## S3 method for class 'gPath' grid.revert(x, strict = FALSE, grep = FALSE, global = FALSE, redraw = FALSE, ...) ## S3 method for class 'grob' grid.revert(x, draw = FALSE, ...)
grid.force(x, ...) ## Default S3 method: grid.force(x, redraw = FALSE, ...) ## S3 method for class 'gPath' grid.force(x, strict = FALSE, grep = FALSE, global = FALSE, redraw = FALSE, ...) ## S3 method for class 'grob' grid.force(x, draw = FALSE, ...) forceGrob(x) grid.revert(x, ...) ## S3 method for class 'gPath' grid.revert(x, strict = FALSE, grep = FALSE, global = FALSE, redraw = FALSE, ...) ## S3 method for class 'grob' grid.revert(x, draw = FALSE, ...)
x |
For the default method, |
strict |
A boolean indicating whether the |
grep |
Whether the |
global |
A boolean indicating whether the function should affect just the
first match of the |
draw |
logical value indicating whether a grob should be drawn after it is forced. |
redraw |
logical value indicating whether to redraw the grid scene after the forcing operation. |
... |
Further arguments for use by methods. |
Some grobs wait until drawing time to generate what content
will actually be drawn (an axis, as produced by grid.xaxis()
,
with an at
or NULL
is a good example because it
has to see what viewport it is going to be drawn in before
it can decide what tick marks to draw).
The content of such grobs (e.g., the tick marks) are not usually
visible to grid.ls()
or accessible to grid.edit()
.
The grid.force()
function replaces a grob with its
at-drawing-time contents. For example, an axis will be
replaced by a vanilla gTree with lines and text representing
the axis tick marks that were actually drawn. This makes
the tick marks
visible to grid.ls()
and accessible to grid.edit()
.
The forceGrob()
function is the internal work horse for
grid.force()
, so will not normally be called directly by
the user. It is exported so that methods can be written for
custom grob classes if necessary.
The grid.revert()
function reverses the effect of
grid.force()
, replacing forced content with the original
grob.
Forcing an explicit grob produces a result as if the grob were drawn in the current drawing context. It may not make sense to draw the result in a different drawing context.
These functions only have an effect for grobs that generate their content
at drawing time using makeContext()
and makeContent()
methods (not for grobs that generate their content
at drawing time using preDrawDetails()
and
drawDetails()
methods).
Paul Murrell
grid.newpage() pushViewport(viewport(width=.5, height=.5)) # Draw xaxis grid.xaxis(name="xax") grid.ls() # Force xaxis grid.force() grid.ls() # Revert xaxis grid.revert() grid.ls() # Draw and force yaxis grid.force(yaxisGrob(), draw=TRUE) grid.ls() # Revert yaxis grid.revert() grid.ls() # Force JUST xaxis grid.force("xax") grid.ls() # Force ALL grid.force() grid.ls() # Revert JUST xaxis grid.revert("xax") grid.ls()
grid.newpage() pushViewport(viewport(width=.5, height=.5)) # Draw xaxis grid.xaxis(name="xax") grid.ls() # Force xaxis grid.force() grid.ls() # Revert xaxis grid.revert() grid.ls() # Draw and force yaxis grid.force(yaxisGrob(), draw=TRUE) grid.ls() # Revert yaxis grid.revert() grid.ls() # Force JUST xaxis grid.force("xax") grid.ls() # Force ALL grid.force() grid.ls() # Revert JUST xaxis grid.revert("xax") grid.ls()
These functions, together with grid.pack
,
grid.place
, packGrob
, and placeGrob
are part of a
GUI-builder-like interface to constructing graphical images.
The idea is that you create a frame with this function then
use grid.pack
or whatever to pack/place objects into the frame.
grid.frame(layout=NULL, name=NULL, gp=gpar(), vp=NULL, draw=TRUE) frameGrob(layout=NULL, name=NULL, gp=gpar(), vp=NULL)
grid.frame(layout=NULL, name=NULL, gp=gpar(), vp=NULL, draw=TRUE) frameGrob(layout=NULL, name=NULL, gp=gpar(), vp=NULL)
layout |
A Grid layout, or NULL. This can be used to initialise the frame with a number of rows and columns, with initial widths and heights, etc. |
name |
A character identifier. |
vp |
An object of class |
gp |
An object of class |
draw |
Should the frame be drawn. |
Both functions create a frame grob (a graphical object describing a
frame), but only grid.frame()
draws the frame (and then only if draw
is TRUE
).
Nothing will actually be
drawn, but it will put the frame on the display list, which means
that the output will be dynamically updated as objects are packed
into the frame. Possibly useful for debugging.
A frame grob. grid.frame()
returns the value invisibly.
Paul Murrell
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")
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")
Draw a curve representing a function.
grid.function(...) functionGrob(f, n = 101, range = "x", units = "native", name = NULL, gp=gpar(), vp = NULL) grid.abline(intercept, slope, ...)
grid.function(...) functionGrob(f, n = 101, range = "x", units = "native", name = NULL, gp=gpar(), vp = NULL) grid.abline(intercept, slope, ...)
f |
A function that must take a single argument
and return a list with two numeric components named |
n |
The number values that will be generated as input
to the function |
range |
Either |
units |
A string indicating the units to use
for the |
intercept |
Numeric. |
slope |
Numeric. |
... |
Arguments passed to |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
n
values are generated and passed to the function f
and a series of lines are
drawn through the resulting x
and y
values.
The generation of the n
values depends on the value of
range
. In the default case, dim
is
"x"
, which means that a set
of x
values are generated covering the range of the current
viewport scale in the x-dimension. If dim
is "y"
then values are generated from the current y-scale instead.
If range
is a numeric vector, then values are generated
from that range.
grid.abline()
provides a simple front-end for a straight
line parameterized by intercept
and slope
.
A functiongrob grob.
Paul Murrell
# 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")
# 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")
Retrieve a grob or a descendant of a grob.
grid.get(gPath, strict = FALSE, grep = FALSE, global = FALSE, allDevices = FALSE) grid.gget(..., grep = TRUE, global = TRUE) getGrob(gTree, gPath, strict = FALSE, grep = FALSE, global = FALSE)
grid.get(gPath, strict = FALSE, grep = FALSE, global = FALSE, allDevices = FALSE) grid.gget(..., grep = TRUE, global = TRUE) getGrob(gTree, gPath, strict = FALSE, grep = FALSE, global = FALSE)
gTree |
A gTree object. |
gPath |
A gPath object. For |
strict |
A boolean indicating whether the gPath must be matched exactly. |
grep |
A boolean indicating whether the |
global |
A boolean indicating whether the function should affect
just the first match of the |
allDevices |
A boolean indicating whether all open devices should be searched for matches, or just the current device. NOT YET IMPLEMENTED. |
... |
Arguments that are passed to |
grid.gget
(g
for global) is just a convenience wrapper for
grid.get
with different defaults.
A grob object.
Paul Murrell
grob
, getGrob
,
addGrob
, removeGrob
.
grid.xaxis(name="xa") grid.get("xa") grid.get(gPath("xa", "ticks")) grid.draw(gTree(name="gt", children=gList(xaxisGrob(name="axis")))) grid.get(gPath("gt", "axis", "ticks"))
grid.xaxis(name="xa") grid.get("xa") grid.get(gPath("xa", "ticks")) grid.draw(gTree(name="gt", children=gList(xaxisGrob(name="axis")))) grid.get(gPath("gt", "axis", "ticks"))
These functions create and draw a set of typeset glyphs.
grid.glyph(...) glyphGrob(glyphInfo, x=.5, y=.5, default.units="npc", hjust="centre", vjust="centre", gp=gpar(), vp=NULL, name=NULL)
grid.glyph(...) glyphGrob(glyphInfo, x=.5, y=.5, default.units="npc", hjust="centre", vjust="centre", gp=gpar(), vp=NULL, name=NULL)
glyphInfo |
An |
x |
A numeric vector or unit object specifying x-location. |
y |
A numeric vector or unit object specifying y-location. |
default.units |
A string indicating the default units to use
if |
hjust , vjust
|
The justification of the glyphs
relative to the ( |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
... |
Arguments passed to |
Both functions create a glyph grob (a graphical object describing
glyphs), but only grid.glyph
draws the glyphs.
A glyph grob.
Paul Murrell
Creates a gTree object from the current grid display list or from a scene generated by user-specified code.
grid.grab(warn = 2, wrap = wrap.grobs, wrap.grobs = FALSE, ...) grid.grabExpr(expr, warn = 2, wrap = wrap.grobs, wrap.grobs = FALSE, width = 7, height = 7, device = offscreen, ...)
grid.grab(warn = 2, wrap = wrap.grobs, wrap.grobs = FALSE, ...) grid.grabExpr(expr, warn = 2, wrap = wrap.grobs, wrap.grobs = FALSE, width = 7, height = 7, device = offscreen, ...)
expr |
An expression to be evaluated. Typically, some calls to grid drawing functions. |
warn |
An integer specifying the amount of warnings to emit. 0 means no warnings, 1 means warn when it is certain that the grab will not faithfully represent the original scene. 2 means warn if there's any possibility that the grab will not faithfully represent the original scene. |
wrap |
A logical indicating how the output should
be captured. If |
wrap.grobs |
A logical indicating whether, if we are wrapping
elements ( |
width , height
|
Size of the device used for temporary rendering. |
device |
A function that opens a graphics device for temporary
rendering. By default this is an off-screen, in-memory device
based on the |
... |
arguments passed to gTree, for example, a name and/or class for the gTree that is created. |
There are four ways to capture grid output as a gTree.
There are two functions for capturing output:
use grid.grab
to capture an existing drawing
and grid.grabExpr
to capture the output from
an expression (without drawing anything).
For each of these functions, the output can be captured in two ways. One way tries to be clever and make a gTree with a childrenvp slot containing all viewports on the display list (including those that are popped) and every grob on the display list as a child of the new gTree; each child has a vpPath in the vp slot so that it is drawn in the appropriate viewport. In other words, the gTree contains all elements on the display list, but in a slightly altered form.
The other way, wrap=TRUE
,
is to create a grob for every element on the
display list (and make all of those grobs children of the
gTree). Only viewports are
wrapped unless wrap.grobs
is also TRUE
.
The first approach creates a more compact and elegant gTree, which is more flexible to work with, but is not guaranteed to faithfully replicate all possible grid output. The second approach is more brute force, and harder to work with, but is more likely to replicate the original output.
An example of a case that will NOT be replicated by wrapping,
with wrap.grobs=TRUE
, is
a scene where the placement of one grob is dependent on another grob
(e.g., via grobX
or grobWidth
).
A gTree object.
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)
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)
Given a path, find all matching grobs and/or viewports on the display list or within a given grob.
grid.grep(path, x = NULL, grobs = TRUE, viewports = FALSE, strict = FALSE, grep = FALSE, global = FALSE, no.match = character(), vpPath = viewports)
grid.grep(path, x = NULL, grobs = TRUE, viewports = FALSE, strict = FALSE, grep = FALSE, global = FALSE, no.match = character(), vpPath = viewports)
path |
a gPath or a vpPath or a character value that could be interpreted as either. |
x |
a grob or |
grobs |
A logical value indicating whether to search for grobs. |
viewports |
A logical value indicating whether to search for viewports. |
strict |
A boolean indicating whether the |
grep |
Whether the |
global |
A boolean indicating whether the function should affect just the
first match of the |
no.match |
The value to return if no matches are found. |
vpPath |
A logical value indicating whether to return the vpPath for each grob as an attribute of the result. |
Either a gPath or a vpPath or,
if global
is TRUE
a list of gPaths and/or vpPaths.
If vpPath
is TRUE
, each gPath result will have an
attribute "vpPath"
.
If there are no matches, no.match
is returned.
grid.ls()
# 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) grid.grep("parent", sampleGTree, strict=TRUE) grid.grep("grandparent", sampleGTree, strict=TRUE) grid.grep("grandparent::parent", sampleGTree) grid.grep("parent::child", sampleGTree) grid.grep("[a-z]", sampleGTree, grep=TRUE) grid.grep("[a-z]", sampleGTree, grep=TRUE, global=TRUE) # Searching for viewports grid.grep("vp1", sampleGTree, viewports=TRUE) grid.grep("vp2", sampleGTree, viewports=TRUE) grid.grep("vp", sampleGTree, viewports=TRUE, grep=TRUE) grid.grep("vp2", sampleGTree, viewports=TRUE, strict=TRUE) grid.grep("vp1::vp2", sampleGTree, viewports=TRUE) # Searching for both grid.grep("[a-z]", sampleGTree, viewports=TRUE, grep=TRUE, global=TRUE)
# 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) grid.grep("parent", sampleGTree, strict=TRUE) grid.grep("grandparent", sampleGTree, strict=TRUE) grid.grep("grandparent::parent", sampleGTree) grid.grep("parent::child", sampleGTree) grid.grep("[a-z]", sampleGTree, grep=TRUE) grid.grep("[a-z]", sampleGTree, grep=TRUE, global=TRUE) # Searching for viewports grid.grep("vp1", sampleGTree, viewports=TRUE) grid.grep("vp2", sampleGTree, viewports=TRUE) grid.grep("vp", sampleGTree, viewports=TRUE, grep=TRUE) grid.grep("vp2", sampleGTree, viewports=TRUE, strict=TRUE) grid.grep("vp1::vp2", sampleGTree, viewports=TRUE) # Searching for both grid.grep("[a-z]", sampleGTree, viewports=TRUE, grep=TRUE, global=TRUE)
This function draws a grill within a Grid viewport.
grid.grill(h = unit(seq(0.25, 0.75, 0.25), "npc"), v = unit(seq(0.25, 0.75, 0.25), "npc"), default.units = "npc", gp=gpar(col = "grey"), vp = NULL)
grid.grill(h = unit(seq(0.25, 0.75, 0.25), "npc"), v = unit(seq(0.25, 0.75, 0.25), "npc"), default.units = "npc", gp=gpar(col = "grey"), vp = NULL)
h |
A numeric vector or unit object indicating the horizontal location of the vertical grill lines. |
v |
A numeric vector or unit object indicating the vertical location of the horizontal grill lines. |
default.units |
A string indicating the default units to use
if |
gp |
An object of class |
vp |
A Grid viewport object. |
None.
Paul Murrell
Creating grid graphical objects, short (“grob”s).
grob()
and gTree()
are the basic creators,
grobTree()
and gList()
take several grobs to build a new
one.
## Grob Creation: grob (..., name = NULL, gp = NULL, vp = NULL, cl = NULL) gTree(..., name = NULL, gp = NULL, vp = NULL, children = NULL, childrenvp = NULL, cl = NULL) grobTree(..., name = NULL, gp = NULL, vp = NULL, childrenvp = NULL, cl = NULL) gList(...) ## Grob Properties: childNames(gTree) is.grob(x)
## Grob Creation: grob (..., name = NULL, gp = NULL, vp = NULL, cl = NULL) gTree(..., name = NULL, gp = NULL, vp = NULL, children = NULL, childrenvp = NULL, cl = NULL) grobTree(..., name = NULL, gp = NULL, vp = NULL, childrenvp = NULL, cl = NULL) gList(...) ## Grob Properties: childNames(gTree) is.grob(x)
... |
For |
name |
a character identifier for the grob. Used to find the grob on the display list and/or as a child of another grob. |
children |
a |
childrenvp |
a |
gp |
A |
vp |
a |
cl |
string giving the class attribute for the new class. |
gTree |
a |
x |
An R object. |
These functions can be used to create a basic "grob"
,
"gTree"
, or "gList"
object, or a new class derived from
one of these.
A grid graphical object (“grob”) is a description of a graphical
item. These basic classes provide default behaviour for
validating, drawing,
and modifying graphical objects. Both grob()
and
gTree()
call the function validDetails
to check
that the object returned is internally coherent.
A "gTree"
can have other grobs as children; when a gTree is drawn, it
draws all of its children. Before drawing its children, a gTree
pushes its childrenvp
slot and then navigates back up (calls
upViewport
) so that the children can specify their location
within the childrenvp
via a vpPath
.
Grob names need not be unique in general, but all children of a
gTree must have different names.
A grob name can be any string, though it is not
advisable to use the gPath
separator (currently
::
) in grob names.
The function childNames
returns the names of the grobs
which are children of a gTree.
All grid primitives (grid.lines
, grid.rect
, ...)
and some higher-level grid components (e.g., grid.xaxis
and grid.yaxis
) are derived from these classes.
grobTree
is just a convenient wrapper for gTree
when the only components of the gTree are grobs (so all
unnamed arguments become children of the gTree).
The grid.grob
function is defunct.
An R object of class "grob"
, a graphical object.
Paul Murrell
grid.draw
,
grid.edit
,
grid.get
.
These functions define and draw one or more groups, where a group is a grob that is drawn in isolation before being combined with the main image. The concept of groups allows for compositing operators, object reuse, and affine transformations (see the Details section).
groupGrob(src, op = "over", dst = NULL, coords = TRUE, name = NULL, gp=gpar(), vp=NULL) grid.group(src, op = "over", dst = NULL, coords = TRUE, name = NULL, gp=gpar(), vp=NULL) defineGrob(src, op = "over", dst = NULL, coords = TRUE, name = NULL, gp=gpar(), vp=NULL) grid.define(src, op = "over", dst = NULL, coords = TRUE, name = NULL, gp=gpar(), vp=NULL) useGrob(group, transform=viewportTransform, name=NULL, gp=gpar(), vp=NULL) grid.use(group, transform=viewportTransform, name=NULL, gp=gpar(), vp=NULL)
groupGrob(src, op = "over", dst = NULL, coords = TRUE, name = NULL, gp=gpar(), vp=NULL) grid.group(src, op = "over", dst = NULL, coords = TRUE, name = NULL, gp=gpar(), vp=NULL) defineGrob(src, op = "over", dst = NULL, coords = TRUE, name = NULL, gp=gpar(), vp=NULL) grid.define(src, op = "over", dst = NULL, coords = TRUE, name = NULL, gp=gpar(), vp=NULL) useGrob(group, transform=viewportTransform, name=NULL, gp=gpar(), vp=NULL) grid.use(group, transform=viewportTransform, name=NULL, gp=gpar(), vp=NULL)
src |
A grob. |
op |
The name of a compositing operator (see Details). |
dst |
A grob. |
coords |
A logical indicating whether grob coordinates should be calculated for the group. |
group |
A character identified referring to the name of a defined group. |
transform |
A function that returns an affine transformation
matrix; see |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
In the simplest usage, we can use grid.group()
to
specify a grob to be drawn in isolation before being combined
with the main image. This can be different from normal drawing if,
for example, the grob draws more than one shape and there
is a mask currently in effect.
Another possible use of grid.group()
is to specify
both src
and dst
and combine them
using a compositing operator other than the default
"over"
, before combining the result with the main image.
For example, if we use the "dest.out"
operator then dst
is only drawn where it is NOT overlapped by src
.
The following (extended) Porter-Duff operators are available:
"clear"
, "source"
, "over"
,
"in"
, "out"
, "atop"
,
"dest"
, "dest.over"
, "dest.in"
,
"dest.out"
, "dest.atop"
, "xor"
,
"add"
, and "saturate"
.
In addition, there are operators corresponding to PDF blend modes:
"multiply"
, "screen"
, "overlay"
,
"darken"
, "lighten"
, "color.dodge"
, "color.burn"
,
"hard.light"
, "soft.light"
, "difference"
, and
"exclusion"
.
However, even if a graphics device supports groups, it may not support all
compositing operators; see dev.capabilities
.
It is also possible to break the process into two steps by
first using grid.define()
to define a group and
then grid.use()
to draw the group. This allows for
reuse of a group (define the group once and use it several times).
If a group is defined in one viewport and used in a different viewport, an implicit transformation is applied. This could be a simple transformation (if the viewports are in different locations, but are the same size), or it could be more complex if the viewports are also different sizes or at different orientations.
NOTE: transformations occur on the graphics device so affect all aspects of drawing. For example, text and line widths are transformed as well as locations.
See viewportTransform
for more information about
transformations and how to customise them.
Not all graphics devices support these functions: for example
xfig
and pictex
do not. For devices that do
provide support, that support may only be partial (e.g., the
Cairo-based devices support more compositing operators than
the pdf()
device).
A grob object.
Paul Murrell
## 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()
## 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()
This function returns a Grid layout, which describes a subdivision of a rectangular region.
grid.layout(nrow = 1, ncol = 1, widths = unit(rep_len(1, ncol), "null"), heights = unit(rep_len(1, nrow), "null"), default.units = "null", respect = FALSE, just="centre")
grid.layout(nrow = 1, ncol = 1, widths = unit(rep_len(1, ncol), "null"), heights = unit(rep_len(1, nrow), "null"), default.units = "null", respect = FALSE, just="centre")
nrow |
An integer describing the number of rows in the layout. |
ncol |
An integer describing the number of columns in the layout. |
widths |
A numeric vector or unit object describing the widths of the columns in the layout. |
heights |
A numeric vector or unit object describing the heights of the rows in the layout. |
default.units |
A string indicating the default units to use
if |
respect |
A logical value or a numeric matrix. If a logical, this indicates whether row heights and column widths should respect each other. If a matrix, non-zero values indicate that the corresponding row and column should be respected (see examples below). |
just |
A string or numeric
vector specifying how the
layout should be
justified if it is not the same size as its parent viewport.
If there are two values, the first
value specifies horizontal justification and the second value specifies
vertical justification. Possible string values are: |
The unit objects given for the widths
and heights
of a layout may use a special units
that only has
meaning for layouts. This is the "null"
unit, which
indicates what relative fraction of the available width/height the
column/row occupies. See the reference for a better description
of relative widths and heights in layouts.
A Grid layout object.
This function must NOT be confused with the base R graphics function
layout
. In particular, do not use layout
in
combination with Grid graphics. The documentation for
layout
may provide some useful information and this
function should behave identically in comparable situations. The
grid.layout
function has added the ability to specify a broader range
of units for row heights and column widths, and allows for nested
layouts (see viewport
).
Paul Murrell
Murrell, P. R. (1999). Layouts: A Mechanism for Arranging Plots on a Page. Journal of Computational and Graphical Statistics, 8, 121–134. doi:10.2307/1390924.
Grid,
grid.show.layout
,
viewport
,
layout
## 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"))
## 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"))
These functions create and draw a series of lines.
grid.lines(x = unit(c(0, 1), "npc"), y = unit(c(0, 1), "npc"), default.units = "npc", arrow = NULL, name = NULL, gp=gpar(), draw = TRUE, vp = NULL) linesGrob(x = unit(c(0, 1), "npc"), y = unit(c(0, 1), "npc"), default.units = "npc", arrow = NULL, name = NULL, gp=gpar(), vp = NULL) grid.polyline(...) polylineGrob(x = unit(c(0, 1), "npc"), y = unit(c(0, 1), "npc"), id=NULL, id.lengths=NULL, default.units = "npc", arrow = NULL, name = NULL, gp=gpar(), vp = NULL)
grid.lines(x = unit(c(0, 1), "npc"), y = unit(c(0, 1), "npc"), default.units = "npc", arrow = NULL, name = NULL, gp=gpar(), draw = TRUE, vp = NULL) linesGrob(x = unit(c(0, 1), "npc"), y = unit(c(0, 1), "npc"), default.units = "npc", arrow = NULL, name = NULL, gp=gpar(), vp = NULL) grid.polyline(...) polylineGrob(x = unit(c(0, 1), "npc"), y = unit(c(0, 1), "npc"), id=NULL, id.lengths=NULL, default.units = "npc", arrow = NULL, name = NULL, gp=gpar(), vp = NULL)
x |
A numeric vector or unit object specifying x-values. |
y |
A numeric vector or unit object specifying y-values. |
default.units |
A string indicating the default units to use
if |
arrow |
A list describing arrow heads to place at either end
of the line, as produced by the |
name |
A character identifier. |
gp |
An object of class |
draw |
A logical value indicating whether graphics output should be produced. |
vp |
A Grid viewport object (or NULL). |
id |
A numeric vector used to separate locations in |
id.lengths |
A numeric vector used to separate locations in |
... |
Arguments passed to |
The first two functions create a lines grob (a graphical object describing
lines), and grid.lines
draws the lines (if draw
is TRUE
).
The second two functions create or draw a polyline grob, which is just like a lines grob, except that there can be multiple distinct lines drawn.
A lines grob or a polyline grob.
grid.lines
returns a lines grob invisibly.
Paul Murrell
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))
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))
Allows the user to click the mouse once within the current graphics device and returns the location of the mouse click within the current viewport, in the specified coordinate system.
grid.locator(unit = "native")
grid.locator(unit = "native")
unit |
The coordinate system in which to return the location
of the mouse click.
See the |
This function is modal (like the graphics package
function locator
) so
the command line and graphics drawing is blocked until
the use has clicked the mouse in the current device.
A unit object representing the location of the mouse click within the current viewport, in the specified coordinate system.
If the user did not click mouse button 1, the function
(invisibly) returns NULL
.
Paul Murrell
viewport
, unit
,
locator
in package graphics, and for an application
see trellis.focus
and
panel.identify
in package
lattice.
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() }
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() }
Return a listing of the names of grobs or viewports.
This is a generic function with methods for grobs (including gTrees) and viewports (including vpTrees).
grid.ls(x=NULL, grobs=TRUE, viewports=FALSE, fullNames=FALSE, recursive=TRUE, print=TRUE, flatten=TRUE, ...) nestedListing(x, gindent=" ", vpindent=gindent) pathListing(x, gvpSep=" | ", gAlign=TRUE) grobPathListing(x, ...)
grid.ls(x=NULL, grobs=TRUE, viewports=FALSE, fullNames=FALSE, recursive=TRUE, print=TRUE, flatten=TRUE, ...) nestedListing(x, gindent=" ", vpindent=gindent) pathListing(x, gvpSep=" | ", gAlign=TRUE) grobPathListing(x, ...)
x |
A grob or viewport or For print functions, this should be the result of a call to
|
grobs |
A logical value indicating whether to list grobs. |
viewports |
A logical value indicating whether to list viewports. |
fullNames |
A logical value indicating whether to embellish object names with information about the object type. |
recursive |
A logical value indicating whether recursive structures should also list their children. |
print |
A logical indicating whether to print the listing or a function that will print the listing. |
flatten |
A logical value indicating whether to flatten the listing. Otherwise a more complex hierarchical object is produced. |
gindent |
The indent used to show nesting in the output for grobs. |
vpindent |
The indent used to show nesting in the output for viewports. |
gvpSep |
The string used to separate viewport paths from grob paths. |
gAlign |
Logical indicating whether to align the left hand edge of all grob paths. |
... |
Arguments passed to the |
If the argument x
is NULL
, the current contents
of the grid display list are listed (both viewports and grobs).
In other words, all objects representing the current scene
are listed.
Otherwise, x
should be a grob or a viewport.
The default behaviour of this function is to print information about the grobs in the current scene. It is also possible to add information about the viewports in the scene. By default, the listing is recursive, so all children of gTrees and all nested viewports are reported.
The format of the information can be controlled via the print
argument, which can be given a function to perform the formatting.
The nestedListing
function produces a line per grob or
viewport, with indenting used to show nesting. The pathListing
function produces a line per grob or viewport, with viewport paths
and grob paths used to show nesting. The grobPathListing
is a simple derivation that only shows lines for grobs. The user
can define new functions.
The result of this function is either a "gridFlatListing"
object (if flatten
is TRUE
) or a "gridListing"
object.
The former is a simple (flat) list of vectors. This is convenient, for example, for working programmatically with the list of grob and viewport names, or for writing a new display function for the listing.
The latter is a more complex hierarchical object (list of lists), but it does contain more detailed information so may be of use for more advanced customisations.
Paul Murrell
# 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) # Show viewports too grid.ls(sampleGTree, viewports=TRUE) # Only show viewports grid.ls(sampleGTree, viewports=TRUE, grobs=FALSE) # Alternate displays # nested listing, custom indent grid.ls(sampleGTree, viewports=TRUE, print=nestedListing, gindent="--") # path listing grid.ls(sampleGTree, viewports=TRUE, print=pathListing) # path listing, without grobs aligned grid.ls(sampleGTree, viewports=TRUE, print=pathListing, gAlign=FALSE) # grob path listing grid.ls(sampleGTree, viewports=TRUE, print=grobPathListing) # path listing, grobs only grid.ls(sampleGTree, print=pathListing) # path listing, viewports only grid.ls(sampleGTree, viewports=TRUE, grobs=FALSE, print=pathListing) # raw flat listing str(grid.ls(sampleGTree, viewports=TRUE, print=FALSE))
# 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) # Show viewports too grid.ls(sampleGTree, viewports=TRUE) # Only show viewports grid.ls(sampleGTree, viewports=TRUE, grobs=FALSE) # Alternate displays # nested listing, custom indent grid.ls(sampleGTree, viewports=TRUE, print=nestedListing, gindent="--") # path listing grid.ls(sampleGTree, viewports=TRUE, print=pathListing) # path listing, without grobs aligned grid.ls(sampleGTree, viewports=TRUE, print=pathListing, gAlign=FALSE) # grob path listing grid.ls(sampleGTree, viewports=TRUE, print=grobPathListing) # path listing, grobs only grid.ls(sampleGTree, print=pathListing) # path listing, viewports only grid.ls(sampleGTree, viewports=TRUE, grobs=FALSE, print=pathListing) # raw flat listing str(grid.ls(sampleGTree, viewports=TRUE, print=FALSE))
Grid has the notion of a current location. These functions sets that location.
grid.move.to(x = 0, y = 0, default.units = "npc", name = NULL, draw = TRUE, vp = NULL) moveToGrob(x = 0, y = 0, default.units = "npc", name = NULL, vp = NULL) grid.line.to(x = 1, y = 1, default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), draw = TRUE, vp = NULL) lineToGrob(x = 1, y = 1, default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), vp = NULL)
grid.move.to(x = 0, y = 0, default.units = "npc", name = NULL, draw = TRUE, vp = NULL) moveToGrob(x = 0, y = 0, default.units = "npc", name = NULL, vp = NULL) grid.line.to(x = 1, y = 1, default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), draw = TRUE, vp = NULL) lineToGrob(x = 1, y = 1, default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), vp = NULL)
x |
A numeric value or a unit object specifying an x-value. |
y |
A numeric value or a unit object specifying a y-value. |
default.units |
A string indicating the default units to use
if |
arrow |
A list describing arrow heads to place at either end
of the line, as produced by the |
name |
A character identifier. |
draw |
A logical value indicating whether graphics output should be produced. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
Both functions create a move.to/line.to grob (a graphical object describing a
move-to/line-to), but only grid.move.to/line.to()
draws the move.to/line.to (and then only if draw
is TRUE
).
A move.to/line.to grob.
grid.move.to/line.to()
returns the value invisibly.
Paul Murrell
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()
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()
This function erases the current device or moves to a new page.
grid.newpage(recording = TRUE, clearGroups = TRUE)
grid.newpage(recording = TRUE, clearGroups = TRUE)
recording |
A logical value to indicate whether the new-page operation should be saved onto the Grid display list. |
clearGroups |
A logical value indicating whether any groups
that have been defined on the current page should be
released (see |
The new page is painted with the fill colour
(gpar("fill")
), which is often transparent. For devices
with a canvas colour (the on-screen devices X11
,
windows
and quartz
), the page is first painted with the
canvas colour and then the background colour.
There are two hooks called "before.grid.newpage"
and
"grid.newpage"
(see setHook
). The latter
is used in the testing code to annotate the new page. The hook
function(s) are called with no argument. (If the value is a character
string, get
is called on it from within the grid
namespace.)
None.
Paul Murrell
These functions create a NULL graphical object, which has zero width, zero height, and draw nothing. It can be used as a place-holder or as an invisible reference point for other drawing.
nullGrob(x = unit(0.5, "npc"), y = unit(0.5, "npc"), default.units = "npc", name = NULL, vp = NULL) grid.null(...)
nullGrob(x = unit(0.5, "npc"), y = unit(0.5, "npc"), default.units = "npc", name = NULL, vp = NULL) grid.null(...)
x |
A numeric vector or unit object specifying x-location. |
y |
A numeric vector or unit object specifying y-location. |
default.units |
A string indicating the default units to use
if |
name |
A character identifier. |
vp |
A Grid viewport object (or NULL). |
... |
Arguments passed to |
A null grob.
Paul Murrell
grid.newpage() grid.null(name="ref") grid.rect(height=grobHeight("ref")) grid.segments(0, 0, grobX("ref", 0), grobY("ref", 0))
grid.newpage() grid.null(name="ref") grid.rect(height=grobHeight("ref")) grid.segments(0, 0, grobX("ref", 0), grobY("ref", 0))
these functions, together with grid.frame
and frameGrob
are part of a
GUI-builder-like interface to constructing graphical images.
The idea is that you create a frame with grid.frame
or
frameGrob
then
use these functions to pack objects into the frame.
grid.pack(gPath, grob, redraw = TRUE, side = NULL, row = NULL, row.before = NULL, row.after = NULL, col = NULL, col.before = NULL, col.after = NULL, width = NULL, height = NULL, force.width = FALSE, force.height = FALSE, border = NULL, dynamic = FALSE) packGrob(frame, grob, side = NULL, row = NULL, row.before = NULL, row.after = NULL, col = NULL, col.before = NULL, col.after = NULL, width = NULL, height = NULL, force.width = FALSE, force.height = FALSE, border = NULL, dynamic = FALSE)
grid.pack(gPath, grob, redraw = TRUE, side = NULL, row = NULL, row.before = NULL, row.after = NULL, col = NULL, col.before = NULL, col.after = NULL, width = NULL, height = NULL, force.width = FALSE, force.height = FALSE, border = NULL, dynamic = FALSE) packGrob(frame, grob, side = NULL, row = NULL, row.before = NULL, row.after = NULL, col = NULL, col.before = NULL, col.after = NULL, width = NULL, height = NULL, force.width = FALSE, force.height = FALSE, border = NULL, dynamic = FALSE)
gPath |
A gPath object, which specifies a frame on the display list. |
frame |
An object of class |
grob |
An object of class |
redraw |
A boolean indicating whether the output should be updated. |
side |
One of |
row |
Which row to add the object to. Must be between 1 and
the-number-of-rows-currently-in-the-frame + 1, or |
row.before |
Add the object to a new row just before this row. |
row.after |
Add the object to a new row just after this row. |
col |
Which col to add the object to. Must be between 1 and
the-number-of-cols-currently-in-the-frame + 1, or |
col.before |
Add the object to a new col just before this col. |
col.after |
Add the object to a new col just after this col. |
width |
Specifies the width of the column that the object is added to (rather than allowing the width to be taken from the object). |
height |
Specifies the height of the row that the object is added to (rather than allowing the height to be taken from the object). |
force.width |
A logical value indicating whether the width of
the column that the grob is being packed into should be EITHER the
width specified in the call to |
force.height |
A logical value indicating whether the height of
the column that the grob is being packed into should be EITHER the
height specified in the call to |
border |
A |
dynamic |
If the width/height is taken from the grob being
packed, this boolean flag indicates whether the
|
packGrob
modifies the given frame grob and returns the modified
frame grob.
grid.pack
destructively modifies a frame grob on the display
list (and redraws the display list if redraw
is TRUE
).
These are (meant to be) very flexible functions. There are many different ways to specify where the new object is to be added relative to the objects already in the frame. The function checks that the specification is not self-contradictory.
NOTE that the width/height of the row/col that the object is added to
is taken from the object itself unless the width
/height
is specified.
packGrob
returns a frame grob, but grid.pack
returns
NULL
.
Paul Murrell
grid.frame
,
grid.place
,
grid.edit
, and gPath
.
These functions create and draw one or more paths. The final point of a path will automatically be connected to the initial point.
pathGrob(x, y, id=NULL, id.lengths=NULL, pathId=NULL, pathId.lengths=NULL, rule="winding", default.units="npc", name=NULL, gp=gpar(), vp=NULL) grid.path(...)
pathGrob(x, y, id=NULL, id.lengths=NULL, pathId=NULL, pathId.lengths=NULL, rule="winding", default.units="npc", name=NULL, gp=gpar(), vp=NULL) grid.path(...)
x |
A numeric vector or unit object specifying x-locations. |
y |
A numeric vector or unit object specifying y-locations. |
id |
A numeric vector used to separate locations in |
id.lengths |
A numeric vector used to separate locations in |
pathId |
A numeric vector used to separate locations in |
pathId.lengths |
A numeric vector used to separate locations in |
rule |
A character value specifying the fill rule: either
|
default.units |
A string indicating the default units to use
if |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
... |
Arguments passed to |
Both functions create a path grob (a graphical object describing a
path), but only grid.path
draws the path (and then only if
draw
is TRUE
).
A path is like a polygon except that the former can contain holes, as interpreted by the fill rule; these fill a region if the path border encircles it an odd or non-zero number of times, respectively.
Not all graphics devices support this function: for example
xfig
and pictex
do not.
A grob object.
Paul Murrell
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')
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')
These functions provide a simpler (and faster) alternative
to the grid.pack()
and packGrob
functions. They can be used to place objects within the existing
rows and columns of a frame layout. They do not provide the ability to
add new rows and columns nor do they affect the
heights and widths of the rows and columns.
grid.place(gPath, grob, row = 1, col = 1, redraw = TRUE) placeGrob(frame, grob, row = NULL, col = NULL)
grid.place(gPath, grob, row = 1, col = 1, redraw = TRUE) placeGrob(frame, grob, row = NULL, col = NULL)
gPath |
A gPath object, which specifies a frame on the display list. |
frame |
An object of class |
grob |
An object of class |
row |
Which row to add the object to. Must be between 1 and the-number-of-rows-currently-in-the-frame. |
col |
Which col to add the object to. Must be between 1 and the-number-of-cols-currently-in-the-frame. |
redraw |
A boolean indicating whether the output should be updated. |
placeGrob
modifies the given frame grob and returns the modified
frame grob.
grid.place
destructively modifies a frame grob on the display
list (and redraws the display list if redraw
is TRUE
).
placeGrob
returns a frame grob, but grid.place
returns
NULL
.
Paul Murrell
grid.frame
,
grid.pack
,
grid.edit
, and gPath
.
This function is just a wrapper for a simple demonstration of how a basic plot and legend can be drawn from scratch using grid.
grid.plot.and.legend()
grid.plot.and.legend()
Paul Murrell
grid.plot.and.legend()
grid.plot.and.legend()
These functions create and draw data symbols.
grid.points(x = stats::runif(10), y = stats::runif(10), pch = 1, size = unit(1, "char"), default.units = "native", name = NULL, gp = gpar(), draw = TRUE, vp = NULL) pointsGrob(x = stats::runif(10), y = stats::runif(10), pch = 1, size = unit(1, "char"), default.units = "native", name = NULL, gp = gpar(), vp = NULL)
grid.points(x = stats::runif(10), y = stats::runif(10), pch = 1, size = unit(1, "char"), default.units = "native", name = NULL, gp = gpar(), draw = TRUE, vp = NULL) pointsGrob(x = stats::runif(10), y = stats::runif(10), pch = 1, size = unit(1, "char"), default.units = "native", name = NULL, gp = gpar(), vp = NULL)
x |
numeric vector or unit object specifying x-values. |
y |
numeric vector or unit object specifying y-values. |
pch |
numeric or character vector indicating what sort of
plotting symbol to use. See |
size |
unit object specifying the size of the plotting symbols. |
default.units |
string indicating the default units to use
if |
name |
character identifier. |
gp |
an R object of class |
draw |
logical indicating whether graphics output should be produced. |
vp |
A Grid viewport object (or NULL). |
Both functions create a points grob (a graphical object describing
points), but only grid.points
draws the points (and then only
if draw
is TRUE
).
A points grob
. grid.points
returns the value invisibly.
Paul Murrell
These functions create and draw a polygon. The final point will automatically be connected to the initial point.
grid.polygon(x=c(0, 0.5, 1, 0.5), y=c(0.5, 1, 0.5, 0), id=NULL, id.lengths=NULL, default.units="npc", name=NULL, gp=gpar(), draw=TRUE, vp=NULL) polygonGrob(x=c(0, 0.5, 1, 0.5), y=c(0.5, 1, 0.5, 0), id=NULL, id.lengths=NULL, default.units="npc", name=NULL, gp=gpar(), vp=NULL)
grid.polygon(x=c(0, 0.5, 1, 0.5), y=c(0.5, 1, 0.5, 0), id=NULL, id.lengths=NULL, default.units="npc", name=NULL, gp=gpar(), draw=TRUE, vp=NULL) polygonGrob(x=c(0, 0.5, 1, 0.5), y=c(0.5, 1, 0.5, 0), id=NULL, id.lengths=NULL, default.units="npc", name=NULL, gp=gpar(), vp=NULL)
x |
A numeric vector or unit object specifying x-locations. |
y |
A numeric vector or unit object specifying y-locations. |
id |
A numeric vector used to separate locations in |
id.lengths |
A numeric vector used to separate locations in |
default.units |
A string indicating the default units to use
if |
name |
A character identifier. |
gp |
An object of class |
draw |
A logical value indicating whether graphics output should be produced. |
vp |
A Grid viewport object (or NULL). |
Both functions create a polygon grob (a graphical object describing a
polygon), but only grid.polygon
draws the polygon (and then only if draw
is TRUE
).
A grob object.
Paul Murrell
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))
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))
Produces a pretty set of approximately n
breakpoints within the
range given.
This is a direct interface to R's graphical engine GEpretty()
function, which also underlies base graphics' package
axis()
, axTicks()
, etc.
grid.pretty(range, n = 5)
grid.pretty(range, n = 5)
range |
a numeric vector of length at least two, as e.g., returned
by |
n |
a non-negative integer specifying the approximate number of breakpoints to be produced. |
A numeric vector of “pretty” breakpoints.
Paul Murrell
Render a raster object (bitmap image) at the given location, size, and orientation.
grid.raster(image, x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = NULL, height = NULL, just = "centre", hjust = NULL, vjust = NULL, interpolate = TRUE, default.units = "npc", name = NULL, gp = gpar(), vp = NULL) rasterGrob(image, x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = NULL, height = NULL, just = "centre", hjust = NULL, vjust = NULL, interpolate = TRUE, default.units = "npc", name = NULL, gp = gpar(), vp = NULL)
grid.raster(image, x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = NULL, height = NULL, just = "centre", hjust = NULL, vjust = NULL, interpolate = TRUE, default.units = "npc", name = NULL, gp = gpar(), vp = NULL) rasterGrob(image, x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = NULL, height = NULL, just = "centre", hjust = NULL, vjust = NULL, interpolate = TRUE, default.units = "npc", name = NULL, gp = gpar(), vp = NULL)
image |
Any R object that can be coerced to a raster object. |
x |
A numeric vector or unit object specifying x-location. |
y |
A numeric vector or unit object specifying y-location. |
width |
A numeric vector or unit object specifying width. |
height |
A numeric vector or unit object specifying height. |
just |
The justification of the rectangle
relative to its (x, y) location. If there are two values, the first
value specifies horizontal justification and the second value specifies
vertical justification. Possible string values are: |
hjust |
A numeric vector specifying horizontal justification.
If specified, overrides the |
vjust |
A numeric vector specifying vertical justification.
If specified, overrides the |
default.units |
A string indicating the default units to use
if |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
interpolate |
A logical value indicating whether to linearly interpolate the image (the alternative is to use nearest-neighbour interpolation, which gives a more blocky result). |
Neither width
nor height
needs to be specified,
in which case, the aspect ratio of the image is preserved. If
both width
and height
are specified, it is likely
that the image will be distorted.
Not all graphics devices are capable of rendering raster images
and some may not be able to produce rotated images (i.e., if
a raster object is rendered within a rotated viewport). See also the
comments under rasterImage
.
All graphical parameter settings in gp
will be ignored,
including alpha
.
A rastergrob grob.
Paul Murrell
dev.capabilities
to see if it is supported.
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)
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)
Evaluates an expression that includes both calculations and drawing that depends on the calculations so that both the calculations and the drawing will be rerun when the scene is redrawn (e.g., device resize or editing).
Intended only for expert use.
recordGrob(expr, list, name=NULL, gp=NULL, vp=NULL) grid.record(expr, list, name=NULL, gp=NULL, vp=NULL)
recordGrob(expr, list, name=NULL, gp=NULL, vp=NULL) grid.record(expr, list, name=NULL, gp=NULL, vp=NULL)
expr |
object of mode |
list |
a list defining the environment in which |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
A grob is created of special class "recordedGrob"
(and drawn, in the case of grid.record
).
The drawDetails
method for this class
evaluates the expression with the list as the evaluation
environment (and the grid Namespace as the parent of that
environment).
This function must be used instead of the
function recordGraphics
; all of the dire warnings
about using recordGraphics
responsibly also apply here.
Paul Murrell
grid.record({ w <- convertWidth(unit(1, "inches"), "npc") grid.rect(width=w) }, list())
grid.record({ w <- convertWidth(unit(1, "inches"), "npc") grid.rect(width=w) }, list())
These functions create and draw rectangles.
grid.rect(x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", name = NULL, gp=gpar(), draw = TRUE, vp = NULL) rectGrob(x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", name = NULL, gp=gpar(), vp = NULL)
grid.rect(x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", name = NULL, gp=gpar(), draw = TRUE, vp = NULL) rectGrob(x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", name = NULL, gp=gpar(), vp = NULL)
x |
A numeric vector or unit object specifying x-location. |
y |
A numeric vector or unit object specifying y-location. |
width |
A numeric vector or unit object specifying width. |
height |
A numeric vector or unit object specifying height. |
just |
The justification of the rectangle
relative to its (x, y) location. If there are two values, the first
value specifies horizontal justification and the second value specifies
vertical justification. Possible string values are: |
hjust |
A numeric vector specifying horizontal justification.
If specified, overrides the |
vjust |
A numeric vector specifying vertical justification.
If specified, overrides the |
default.units |
A string indicating the default units to use
if |
name |
A character identifier. |
gp |
An object of class |
draw |
A logical value indicating whether graphics output should be produced. |
vp |
A Grid viewport object (or NULL). |
Both functions create a rect grob (a graphical object describing
rectangles), but only grid.rect
draws the rectangles (and then only if draw
is TRUE
).
A rect grob. grid.rect
returns the value invisibly.
Paul Murrell
Replays the current grid display list.
grid.refresh()
grid.refresh()
Paul Murrell
Remove a grob from a gTree or a descendant of a gTree.
grid.remove(gPath, warn = TRUE, strict = FALSE, grep = FALSE, global = FALSE, allDevices = FALSE, redraw = TRUE) grid.gremove(..., grep = TRUE, global = TRUE) removeGrob(gTree, gPath, strict = FALSE, grep = FALSE, global = FALSE, warn = TRUE)
grid.remove(gPath, warn = TRUE, strict = FALSE, grep = FALSE, global = FALSE, allDevices = FALSE, redraw = TRUE) grid.gremove(..., grep = TRUE, global = TRUE) removeGrob(gTree, gPath, strict = FALSE, grep = FALSE, global = FALSE, warn = TRUE)
gTree |
A gTree object. |
gPath |
a gPath object. For |
strict |
a |
grep |
a |
global |
a |
allDevices |
a |
warn |
A logical to indicate whether failing to find the specified grob should trigger an error. |
redraw |
A logical value to indicate whether to redraw the grob. |
... |
arguments passed to |
removeGrob
copies the specified grob and returns a modified
grob.
grid.remove
destructively modifies a grob on the display list.
If redraw
is TRUE
it then redraws everything to reflect the change.
grid.gremove
(g
for global) is just a convenience wrapper for
grid.remove
with different defaults.
removeGrob
returns a grob object; grid.remove
returns
NULL
.
Paul Murrell
Change the order in which the children of a gTree get drawn.
grid.reorder(gPath, order, back=TRUE, grep=FALSE, redraw=TRUE) reorderGrob(x, order, back=TRUE)
grid.reorder(gPath, order, back=TRUE, grep=FALSE, redraw=TRUE) reorderGrob(x, order, back=TRUE)
gPath |
A gPath object specifying a gTree within the current scene. |
x |
A gTree object to be modified. |
order |
A character vector or a numeric vector that specifies the new drawing order for the children of the gTree. May not refer to all children of the gTree (see Details). |
back |
Controls what happens when the |
grep |
Should the |
redraw |
Should the modified scene be redrawn? |
In the simplest case, order
specifies a new ordering for all of
the children of the gTree. The children may be specified either by
name or by existing numerical order.
If the order
does not
specify all children of the gTree then, by default, the children
specified by order
are drawn first and then all remaining
children are drawn. If back=FALSE
then the children not
specified in order
are drawn first, followed by the specified
children. This makes it easy to specify a send-to-back or
bring-to-front reordering. The order
argument is always
in back-to-front order.
It is not possible to reorder the grid display list (the top-level
grobs in the current scene) because the display list is a mixture of
grobs and viewports (so it is not clear what reordering even means and
it would be too easy to end up with a scene that would not draw).
If you want to reorder the grid display list, try grid.grab()
to create a gTree and then reorder (and redraw) that gTree.
grid.reorder()
is called for its side-effect of modifying the
current scene.
reorderGrob()
returns the modified gTree.
This function may return a gTree that will not draw. For example, a
gTree has two children, A and B (in that order),
and the width of child B depends on the width of child A (e.g., a box
around a piece of text). Switching the order so that B is drawn
before A will not allow B to be drawn. If this happens with
grid.reorder()
, the modification will not be performed. If
this happens with reorderGrob()
it should be possible simply to
restore the original order.
Paul Murrell
# 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)
# 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)
These functions create and draw line segments.
grid.segments(x0 = unit(0, "npc"), y0 = unit(0, "npc"), x1 = unit(1, "npc"), y1 = unit(1, "npc"), default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), draw = TRUE, vp = NULL) segmentsGrob(x0 = unit(0, "npc"), y0 = unit(0, "npc"), x1 = unit(1, "npc"), y1 = unit(1, "npc"), default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), vp = NULL)
grid.segments(x0 = unit(0, "npc"), y0 = unit(0, "npc"), x1 = unit(1, "npc"), y1 = unit(1, "npc"), default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), draw = TRUE, vp = NULL) segmentsGrob(x0 = unit(0, "npc"), y0 = unit(0, "npc"), x1 = unit(1, "npc"), y1 = unit(1, "npc"), default.units = "npc", arrow = NULL, name = NULL, gp = gpar(), vp = NULL)
x0 |
Numeric indicating the starting x-values of the line segments. |
y0 |
Numeric indicating the starting y-values of the line segments. |
x1 |
Numeric indicating the stopping x-values of the line segments. |
y1 |
Numeric indicating the stopping y-values of the line segments. |
default.units |
A string. |
arrow |
A list describing arrow heads to place at either end
of the line segments, as produced by the |
name |
A character identifier. |
gp |
An object of class |
draw |
A logical value indicating whether graphics output should be produced. |
vp |
A Grid viewport object (or NULL). |
Both functions create a segments grob (a graphical object describing
segments), but only grid.segments
draws the segments (and then only if draw
is TRUE
).
A segments grob. grid.segments
returns the value invisibly.
Paul Murrell
Replace a grob or a descendant of a grob.
grid.set(gPath, newGrob, strict = FALSE, grep = FALSE, redraw = TRUE) setGrob(gTree, gPath, newGrob, strict = FALSE, grep = FALSE)
grid.set(gPath, newGrob, strict = FALSE, grep = FALSE, redraw = TRUE) setGrob(gTree, gPath, newGrob, strict = FALSE, grep = FALSE)
gTree |
A gTree object. |
gPath |
A gPath object. For |
newGrob |
A grob object. |
strict |
A boolean indicating whether the gPath must be matched exactly. |
grep |
A boolean indicating whether the |
redraw |
A logical value to indicate whether to redraw the grob. |
setGrob
copies the specified grob and returns a modified
grob.
grid.set
destructively replaces a grob on the display list.
If redraw
is TRUE
it then redraws everything to reflect the change.
These functions should not normally be called by the user.
setGrob
returns a grob object; grid.set
returns NULL
.
Paul Murrell
This function uses Grid graphics to draw a diagram of a Grid layout.
grid.show.layout(l, newpage=TRUE, vp.ex = 0.8, bg = "light grey", cell.border = "blue", cell.fill = "light blue", cell.label = TRUE, label.col = "blue", unit.col = "red", vp = NULL, ...)
grid.show.layout(l, newpage=TRUE, vp.ex = 0.8, bg = "light grey", cell.border = "blue", cell.fill = "light blue", cell.label = TRUE, label.col = "blue", unit.col = "red", vp = NULL, ...)
l |
A Grid layout object. |
newpage |
A logical value indicating whether to move on to a new page before drawing the diagram. |
vp.ex |
positive number, typically in |
bg |
The colour used for the background. |
cell.border |
The colour used to draw the borders of the cells in the layout. |
cell.fill |
The colour used to fill the cells in the layout. |
cell.label |
A logical indicating whether the layout cells should be labelled. |
label.col |
The colour used for layout cell labels. |
unit.col |
The colour used for labelling the widths/heights of columns/rows. |
vp |
A Grid viewport object (or NULL). |
... |
Arguments passed to |
A viewport is created within vp
to provide a margin for
annotation, and the layout is drawn within that new viewport.
The margin is filled with light grey, the new viewport is filled
with white and framed with a black border, and the layout regions
are filled with light blue and framed with a blue border.
The diagram is annotated with the widths and heights (including units)
of the columns and rows of the layout using red text. (All colours
are defaults and may be customised via function arguments.)
None.
Paul Murrell
## 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 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")))
This function uses Grid graphics to draw a diagram of a Grid viewport.
grid.show.viewport(v, parent.layout = NULL, newpage = TRUE, vp.ex = 0.8, border.fill="light grey", vp.col="blue", vp.fill="light blue", scale.col="red", vp = NULL)
grid.show.viewport(v, parent.layout = NULL, newpage = TRUE, vp.ex = 0.8, border.fill="light grey", vp.col="blue", vp.fill="light blue", scale.col="red", vp = NULL)
v |
A Grid viewport object. |
parent.layout |
A grid layout object. If this is not NULL and
the viewport given in |
newpage |
A logical value to indicate whether to move to a new page before drawing the diagram. |
vp.ex |
positive number, typically in |
border.fill |
Colour to fill the border margin. |
vp.col |
Colour for the border of the viewport region. |
vp.fill |
Colour to fill the viewport region. |
scale.col |
Colour to draw the viewport axes. |
vp |
A Grid viewport object (or NULL). |
A viewport is created within vp
to provide a margin for
annotation, and the diagram is drawn within that new viewport.
By default, the margin is filled with light grey, the new viewport is filled
with white and framed with a black border, and the viewport region
is filled with light blue and framed with a blue border.
The diagram is annotated with the width and height (including units)
of the viewport, the (x, y) location of the viewport, and
the x- and y-scales of the viewport, using red lines and text.
None.
Paul Murrell
## 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))
## 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))
These functions stroke (draw a line along the border) or fill (or both) a path, where the path is defined by a grob.
strokeGrob(x, ...) ## S3 method for class 'grob' strokeGrob(x, name=NULL, gp=gpar(), vp=NULL, ...) ## S3 method for class 'GridPath' strokeGrob(x, name=NULL, vp=NULL, ...) grid.stroke(...) fillGrob(x, ...) ## S3 method for class 'grob' fillGrob(x, rule=c("winding", "evenodd"), name=NULL, gp=gpar(), vp=NULL, ...) ## S3 method for class 'GridPath' fillGrob(x, name=NULL, vp=NULL, ...) grid.fill(...) fillStrokeGrob(x, ...) ## S3 method for class 'grob' fillStrokeGrob(x, rule=c("winding", "evenodd"), name=NULL, gp=gpar(), vp=NULL, ...) ## S3 method for class 'GridPath' fillStrokeGrob(x, name=NULL, vp=NULL, ...) grid.fillStroke(...) as.path(x, gp=gpar(), rule=c("winding", "evenodd"))
strokeGrob(x, ...) ## S3 method for class 'grob' strokeGrob(x, name=NULL, gp=gpar(), vp=NULL, ...) ## S3 method for class 'GridPath' strokeGrob(x, name=NULL, vp=NULL, ...) grid.stroke(...) fillGrob(x, ...) ## S3 method for class 'grob' fillGrob(x, rule=c("winding", "evenodd"), name=NULL, gp=gpar(), vp=NULL, ...) ## S3 method for class 'GridPath' fillGrob(x, name=NULL, vp=NULL, ...) grid.fill(...) fillStrokeGrob(x, ...) ## S3 method for class 'grob' fillStrokeGrob(x, rule=c("winding", "evenodd"), name=NULL, gp=gpar(), vp=NULL, ...) ## S3 method for class 'GridPath' fillStrokeGrob(x, name=NULL, vp=NULL, ...) grid.fillStroke(...) as.path(x, gp=gpar(), rule=c("winding", "evenodd"))
x |
A grob or the result of a call to |
rule |
A fill rule. |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
... |
Arguments to |
A path is defined by the shapes that the grob given in x
would draw. The grob only contributes to the outline of the
path; graphical parameter settings such as line colour and fill
are ignored.
grid.stroke()
will only ever draw the border (even when
a fill is specified).
grid.fill()
will only ever fill the path (even when a line
colour is specified).
A stroke will only ever happen if a non-transparent line colour is specified and a fill will only ever happen if a non-transparent fill is specified.
as.path()
allows graphical parameter settings and a fill
rule to be associated with a grob. This can be useful when
specifying a clipping path for a viewport (see viewport
).
Not all graphics devices support these functions: for example
xfig
and pictex
do not.
A grob object.
Paul Murrell
## 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)))
## 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)))
These functions create and draw text and plotmath expressions.
grid.text(label, x = unit(0.5, "npc"), y = unit(0.5, "npc"), just = "centre", hjust = NULL, vjust = NULL, rot = 0, check.overlap = FALSE, default.units = "npc", name = NULL, gp = gpar(), draw = TRUE, vp = NULL) textGrob(label, x = unit(0.5, "npc"), y = unit(0.5, "npc"), just = "centre", hjust = NULL, vjust = NULL, rot = 0, check.overlap = FALSE, default.units = "npc", name = NULL, gp = gpar(), vp = NULL)
grid.text(label, x = unit(0.5, "npc"), y = unit(0.5, "npc"), just = "centre", hjust = NULL, vjust = NULL, rot = 0, check.overlap = FALSE, default.units = "npc", name = NULL, gp = gpar(), draw = TRUE, vp = NULL) textGrob(label, x = unit(0.5, "npc"), y = unit(0.5, "npc"), just = "centre", hjust = NULL, vjust = NULL, rot = 0, check.overlap = FALSE, default.units = "npc", name = NULL, gp = gpar(), vp = NULL)
label |
A character or expression vector. Other
objects are coerced by |
x |
A numeric vector or unit object specifying x-values. |
y |
A numeric vector or unit object specifying y-values. |
just |
The justification of the text
relative to its (x, y) location. If there are two values, the first
value specifies horizontal justification and the second value specifies
vertical justification. Possible string values are: |
hjust |
A numeric vector specifying horizontal justification.
If specified, overrides the |
vjust |
A numeric vector specifying vertical justification.
If specified, overrides the |
rot |
The angle to rotate the text. |
check.overlap |
A logical value to indicate whether to check for and omit overlapping text (within that grob). |
default.units |
A string indicating the default units to use
if |
name |
A character identifier. |
gp |
An object of class |
draw |
A logical value indicating whether graphics output should be produced. |
vp |
A Grid viewport object (or NULL). |
Both functions create a text grob (a graphical object describing
text), but only grid.text
draws the text (and then only if draw
is TRUE
).
If the label
argument is an expression, the output is
formatted as a mathematical annotation, as for base graphics text.
A text grob. grid.text()
returns the value invisibly.
Paul Murrell
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)
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)
These functions create and draw an x-axis.
grid.xaxis(at = NULL, label = TRUE, main = TRUE, edits = NULL, name = NULL, gp = gpar(), draw = TRUE, vp = NULL) xaxisGrob(at = NULL, label = TRUE, main = TRUE, edits = NULL, name = NULL, gp = gpar(), vp = NULL)
grid.xaxis(at = NULL, label = TRUE, main = TRUE, edits = NULL, name = NULL, gp = gpar(), draw = TRUE, vp = NULL) xaxisGrob(at = NULL, label = TRUE, main = TRUE, edits = NULL, name = NULL, gp = gpar(), vp = NULL)
at |
A numeric vector of x-value locations for the tick marks. |
label |
A logical value indicating whether to draw the labels
on the tick marks, or an expression or character vector which
specify the labels to use. If not logical, must be the same
length as the |
main |
A logical value indicating whether to draw the axis
at the bottom ( |
edits |
A gEdit or gEditList containing edit operations
to apply (to the children of the axis)
when the axis is first created and during redrawing
whenever |
name |
A character identifier. |
gp |
An object of class |
draw |
A logical value indicating whether graphics output should be produced. |
vp |
A Grid viewport object (or |
Both functions create an xaxis grob (a graphical object describing an
xaxis), but only grid.xaxis
draws the xaxis (and then only if draw
is TRUE
).
An xaxis grob. grid.xaxis
returns the value invisibly.
If the at
slot of an xaxis grob is not NULL
then
the xaxis will have the following children:
representing the line at the base of the tick marks.
representing the tick marks.
representing the tick labels.
If the at
slot is NULL
then there are no children
and ticks are drawn based on the current viewport scale.
Paul Murrell
These functions create and draw an xspline, a curve drawn relative to control points.
grid.xspline(...) xsplineGrob(x = c(0, 0.5, 1, 0.5), y = c(0.5, 1, 0.5, 0), id = NULL, id.lengths = NULL, default.units = "npc", shape = 0, open = TRUE, arrow = NULL, repEnds = TRUE, name = NULL, gp = gpar(), vp = NULL)
grid.xspline(...) xsplineGrob(x = c(0, 0.5, 1, 0.5), y = c(0.5, 1, 0.5, 0), id = NULL, id.lengths = NULL, default.units = "npc", shape = 0, open = TRUE, arrow = NULL, repEnds = TRUE, name = NULL, gp = gpar(), vp = NULL)
x |
A numeric vector or unit object specifying x-locations of spline control points. |
y |
A numeric vector or unit object specifying y-locations of spline control points. |
id |
A numeric vector used to separate locations in |
id.lengths |
A numeric vector used to separate locations in |
default.units |
A string indicating the default units to use
if |
shape |
A numeric vector of values between -1 and 1, which control the shape of the spline relative to the control points. |
open |
A logical value indicating whether the spline is a line or a closed shape. |
arrow |
A list describing arrow heads to place at either end
of the xspline, as produced by the |
repEnds |
A logical value indicating whether the first and last control points should be replicated for drawing the curve (see Details below). |
name |
A character identifier. |
gp |
An object of class |
vp |
A Grid viewport object (or NULL). |
... |
Arguments to be passed to |
Both functions create an xspline grob (a graphical object describing an
xspline), but only grid.xspline
draws the xspline.
An xspline is a line drawn relative to control points. For each control point, the line may pass through (interpolate) the control point or it may only approach (approximate) the control point; the behaviour is determined by a shape parameter for each control point.
If the shape parameter is greater than zero, the spline approximates the control points (and is very similar to a cubic B-spline when the shape is 1). If the shape parameter is less than zero, the spline interpolates the control points (and is very similar to a Catmull-Rom spline when the shape is -1). If the shape parameter is 0, the spline forms a sharp corner at that control point.
For open xsplines, the start and end control points must have a shape of 0 (and non-zero values are silently converted to zero without warning).
For open xsplines, by default the start and end control points are
actually replicated before the curve is drawn. A curve is drawn
between (interpolating or approximating)
the second and third of each set of four control points, so
this default behaviour ensures that
the resulting curve starts at the first control point you have
specified and ends at the last control point.
The default
behaviour can be turned off via the repEnds
argument,
in which case the curve that is drawn starts (approximately) at
the second control point and ends (approximately) at the first and
second-to-last control point.
The repEnds
argument is ignored for closed xsplines.
Missing values are not allowed for x
and y
(i.e., it is not valid for a control point to be missing).
For closed xsplines, a curve is automatically drawn between the final control point and the initial control point.
A grob object.
Blanc, C. and Schlick, C. (1995), "X-splines : A Spline Model Designed for the End User", in Proceedings of SIGGRAPH 95, pp. 377–386. https://dept-info.labri.fr/~schlick/DOC/sig1.html
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()
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()
These functions create and draw a y-axis.
grid.yaxis(at = NULL, label = TRUE, main = TRUE, edits = NULL, name = NULL, gp = gpar(), draw = TRUE, vp = NULL) yaxisGrob(at = NULL, label = TRUE, main = TRUE, edits = NULL, name = NULL, gp = gpar(), vp = NULL)
grid.yaxis(at = NULL, label = TRUE, main = TRUE, edits = NULL, name = NULL, gp = gpar(), draw = TRUE, vp = NULL) yaxisGrob(at = NULL, label = TRUE, main = TRUE, edits = NULL, name = NULL, gp = gpar(), vp = NULL)
at |
A numeric vector of y-value locations for the tick marks. |
label |
A logical value indicating whether to draw the labels
on the tick marks, or an expression or character vector which
specify the labels to use. If not logical, must be the same
length as the |
main |
A logical value indicating whether to draw the axis
at the left ( |
edits |
A gEdit or gEditList containing edit operations
to apply (to the children of the axis)
when the axis is first created and during redrawing
whenever |
name |
A character identifier. |
gp |
An object of class |
draw |
A logical value indicating whether graphics output should be produced. |
vp |
A Grid viewport object (or |
Both functions create a yaxis grob (a graphical object describing a
yaxis), but only grid.yaxis
draws the yaxis (and then only if draw
is TRUE
).
A yaxis grob. grid.yaxis
returns the value invisibly.
If the at
slot of an xaxis grob is not NULL
then
the xaxis will have the following children:
representing the line at the base of the tick marks.
representing the tick marks.
representing the tick labels.
If the at
slot is NULL
then there are no children
and ticks are drawn based on the current viewport scale.
Paul Murrell
These functions support the development of grobPoints
methods for custom grobs.
gridCoords(x, y) gridGrobCoords(x, name, rule = NULL) gridGTreeCoords(x, name) emptyCoords emptyGrobCoords(name) emptyGTreeCoords(name) isEmptyCoords(coords)
gridCoords(x, y) gridGrobCoords(x, name, rule = NULL) gridGTreeCoords(x, name) emptyCoords emptyGrobCoords(name) emptyGTreeCoords(name) isEmptyCoords(coords)
x |
For |
y |
A numeric vector. |
name |
A character value. |
rule |
A fill rule, either |
coords |
A set of grob coordinates (as generated by |
These functions help the developer of a grobPoints
method
to generate the coordinates from a custom grob.
The emptyCoords
object can be used to return a "null"
result (e.g., when asking for closed
coordinates on an
open line) and the isEmptyCoords
function can be used to check for
"null" results.
For gridCoords
a "GridCoords"
object.
For gridGrobCoords
a "GridGrobCoords"
object.
For gridGTreeCoords
a "GridGTreeCoords"
object.
Paul Murrell
These functions calculate points along the perimeter (or length) of a grob.
grobCoords(x, closed, ...) grobPoints(x, closed, ...) isClosed(x, ...)
grobCoords(x, closed, ...) grobPoints(x, closed, ...) isClosed(x, ...)
x |
A grob object. |
closed |
Whether we are asking for points along the perimeter of a closed object or points along the length of an open object. Some grobs (e.g., X-splines) can do both. This defaults to |
... |
Arguments to be used by methods. |
The difference between grobCoords
and grobPoints
is that grobCoords
performs all pre- and post-drawing operations
on the grob that would normally occur if the grob was being drawn,
then calls grobPoints
. So the former takes into account
any vp
and gp
settings on the grob. This means
that users should usually only want to call grobCoords
;
only (expert) developers may have a need to call grobPoints
.
Custom grobs can write their own methods for grobPoints
(see gridCoords
).
The isClosed
function returns TRUE
or FALSE
to indicate whether a grob is a closed shape. The default response
is TRUE
, unless a method has been defined otherwise
(e.g., for lines and line segments).
Either a "GridGrobCoords"
object
(a list of lists with components x
and y
) or
a "GridGTreeCoords"
object
(a list of "GridGrobCoords"
and/or "GridGTreeCoords"
objects).
All locations are in inches relative to the current grid viewport.
Paul Murrell
This function generates a unique (within-session) name for a grob, based on the grob's class.
grobName(grob = NULL, prefix = "GRID")
grobName(grob = NULL, prefix = "GRID")
grob |
A grob object or |
prefix |
The prefix part of the name. |
A character string of the form prefix.class(grob).index
Paul Murrell
These functions create a unit object describing the width or height of a grob. They are generic.
grobWidth(x) grobHeight(x) grobAscent(x) grobDescent(x)
grobWidth(x) grobHeight(x) grobAscent(x) grobDescent(x)
x |
A grob object. |
A unit object.
Paul Murrell
unit
and
stringWidth
These functions create a unit object describing a location somewhere on the boundary of a grob. They are generic.
grobX(x, theta) grobY(x, theta)
grobX(x, theta) grobY(x, theta)
x |
A grob, or gList, or gTree, or gPath. |
theta |
An angle indicating where the location is
on the grob boundary. Can be one of |
The angle is anti-clockwise with zero corresponding to a line with an origin centred between the extreme points of the shape, and pointing at 3 o'clock.
If the grob describes a single shape, the boundary value should correspond to the exact edge of the shape.
If the grob describes multiple shapes, the boundary value will either correspond to the edge of a bounding box around all of the shapes described by the grob (for multiple rectangles, circles, xsplines, or text), or to a convex hull around all vertices of all shapes described by the grob (for multiple polygons, points, lines, polylines, and segments).
Points grobs are currently a special case because the convex hull is based on the data symbol locations and does not take into account the extent of the data symbols themselves.
The extents of any arrow heads are currently not taken into account.
A unit object.
Paul Murrell
Constructing a legend grob (in progress)
legendGrob(labels, nrow, ncol, byrow = FALSE, do.lines = has.lty || has.lwd, lines.first = TRUE, hgap = unit(1, "lines"), vgap = unit(1, "lines"), default.units = "lines", pch, gp = gpar(), vp = NULL) grid.legend(..., draw=TRUE)
legendGrob(labels, nrow, ncol, byrow = FALSE, do.lines = has.lty || has.lwd, lines.first = TRUE, hgap = unit(1, "lines"), vgap = unit(1, "lines"), default.units = "lines", pch, gp = gpar(), vp = NULL) grid.legend(..., draw=TRUE)
labels |
legend labels (expressions) |
nrow , ncol
|
integer; the number of rows or columns, respectively
of the legend “layout”. |
byrow |
logical indicating whether rows of the legend are filled first. |
do.lines |
logical indicating whether legend lines are drawn. |
lines.first |
logical indicating whether legend lines are drawn first and hence in a plain “below” legend symbols. |
hgap |
horizontal space between the legend entries |
vgap |
vertical space between the legend entries |
default.units |
default units, see |
pch |
legend symbol, numeric or character, passed to
|
gp |
an R object of class |
vp |
a Grid |
... |
for |
draw |
logical indicating whether graphics output should be produced. |
Both functions create a legend grob
(a graphical object
describing a plot legend), but only grid.legend
draws it (only
if draw
is TRUE
).
Grid, viewport
;
pointsGrob
, linesGrob
.
grid.plot.and.legend
contains a simple example.
## 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)
## 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)
These generic hook functions are called whenever a grid grob is drawn. They provide an opportunity for customising the drawing context and drawing content of a new class derived from grob (or gTree).
makeContext(x) makeContent(x)
makeContext(x) makeContent(x)
x |
A grid grob. |
These functions are called by the grid.draw
methods for grobs
and gTrees.
makeContext
is called first during the drawing of a grob.
This function should be used to modify the vp
slot
of x
(and/or the childrenvp
slot if x
is a gTree). The function must return the modified x
.
Note that
the default behaviour for grobs is to push any viewports in the
vp
slot, and for gTrees is to also push and up any viewports in the
childrenvp
slot, so this function is used to customise the
drawing context for a grob or gTree.
makeContent
is called next and is where any additional
calculations should occur and graphical content should
be generated (see, for example,
grid:::makeContent.xaxis
).
This function should be used to modify the children
of a gTree.
The function must return the modified x
.
Note that the default behaviour
for gTrees is to draw all grobs in the children
slot,
so this function is used to customise the drawing content for a gTree.
It is also possible to customise the drawing content for a simple
grob, but more care needs to be taken; for example, the function
should return a standard grid primitive with a drawDetails()
method in this case.
Note that these functions should be cumulative in their
effects, so that the x
returned by makeContent()
includes any changes made by makeContext()
.
Note that makeContext
is
also called in the calculation of "grobwidth"
and
"grobheight"
units.
Both functions are expected to return a grob or gTree
(a modified version of x
).
Paul Murrell
"Changes to grid for R 3.0.0", Paul Murrell, The R Journal (2013) 5:2, pages 148-160.
Functions to define gradient fills and pattern fills.
linearGradient(colours = c("black", "white"), stops = seq(0, 1, length.out = length(colours)), x1 = unit(0, "npc"), y1 = unit(0, "npc"), x2 = unit(1, "npc"), y2 = unit(1, "npc"), default.units = "npc", extend = c("pad", "repeat", "reflect", "none"), group = TRUE) radialGradient(colours = c("black", "white"), stops = seq(0, 1, length.out = length(colours)), cx1 = unit(.5, "npc"), cy1 = unit(.5, "npc"), r1 = unit(0, "npc"), cx2 = unit(.5, "npc"), cy2 = unit(.5, "npc"), r2 = unit(.5, "npc"), default.units = "npc", extend = c("pad", "repeat", "reflect", "none"), group = TRUE) pattern(grob, x = 0.5, y = 0.5, width = 1, height = 1, default.units = "npc", just="centre", hjust=NULL, vjust=NULL, extend = c("pad", "repeat", "reflect", "none"), gp = gpar(fill="transparent"), group = TRUE)
linearGradient(colours = c("black", "white"), stops = seq(0, 1, length.out = length(colours)), x1 = unit(0, "npc"), y1 = unit(0, "npc"), x2 = unit(1, "npc"), y2 = unit(1, "npc"), default.units = "npc", extend = c("pad", "repeat", "reflect", "none"), group = TRUE) radialGradient(colours = c("black", "white"), stops = seq(0, 1, length.out = length(colours)), cx1 = unit(.5, "npc"), cy1 = unit(.5, "npc"), r1 = unit(0, "npc"), cx2 = unit(.5, "npc"), cy2 = unit(.5, "npc"), r2 = unit(.5, "npc"), default.units = "npc", extend = c("pad", "repeat", "reflect", "none"), group = TRUE) pattern(grob, x = 0.5, y = 0.5, width = 1, height = 1, default.units = "npc", just="centre", hjust=NULL, vjust=NULL, extend = c("pad", "repeat", "reflect", "none"), gp = gpar(fill="transparent"), group = TRUE)
colours |
Two or more colours for the gradient to transition between. |
stops |
Locations of the gradient colours between the start and end points of the gradient (as a proportion of the distance from the start point to the end point). |
x1 , y1 , x2 , y2
|
The start and end points for a linear gradient. |
default.units |
The coordinate system to use if any location or dimension is specified as just a numeric value. |
extend |
What happens outside the start and end of the gradient (see Details). |
cx1 , cy1 , r1 , cx2 , cy2 , r2
|
The centre and radius of the start and end circles for a radial gradient. |
grob |
A grob (or a gTree) that will be drawn as the tile in a pattern fill. |
x , y , width , height
|
The size of the tile for a pattern fill. |
just , hjust , vjust
|
The justification of the tile relative to its location. |
gp |
Default graphical parameter settings for the tile. |
group |
A logical indicating whether the gradient or pattern is relative to the bounding box of the grob or whether it is relative to individual shapes within the grob. |
Use these functions to define a gradient fill or pattern fill and
then use the resulting object as the value for fill
in a call to the gpar()
function.
The possible values of extend, and their meanings, are:
[pad
:] propagate the value of the gradient at its
boundary.
[none
:] produce no fill beyond the limits of the
gradient.
[repeat
:] repeat the fill.
[reflect
:] repeat the fill in reverse.
To create a tiling pattern, provide a simple grob (like a circle),
specify the location and size of the pattern to include the simple
grob, and specify extend="repeat"
.
On viewports, gradients and patterns are relative to the entire
viewport, unless group = FALSE
, in which case they are
relative to individual grobs as they are drawn.
On gTrees, gradients and patterns are relative to a bounding
box around all of the children of the gTree,
unless group = FALSE
, in which case they are
relative to individual children as they are drawn.
On grobs, gradients and patterns are relative to a bounding
box around all of the shapes that are drawn by the grob,
unless group = FALSE
, in which case they are
relative to individual shapes.
A linear gradient or radial gradient or pattern object.
Gradient fills and pattern fills are not supported on all graphics
devices. Where they are not supported, closed shapes will be
rendered with a transparent fill. Where they are supported,
not all values of extend
are supported.
On Cairo devices, use of clipping in the pattern definition should be avoided because it is very likely to result in distortion of the pattern tile.
Paul Murrell
This is a convenience function for producing a viewport with the common S-style plot layout – i.e., a central plot region surrounded by margins given in terms of a number of lines of text.
plotViewport(margins=c(5.1, 4.1, 4.1, 2.1), ...)
plotViewport(margins=c(5.1, 4.1, 4.1, 2.1), ...)
margins |
A numeric vector interpreted in the same way
as |
... |
All other arguments will be passed to a call to
the |
A grid viewport object.
Paul Murrell
viewport
and
dataViewport
.
current.viewport()
returns the viewport that Grid is going to draw into.
current.parent
returns the parent of the current viewport.
current.vpTree
returns the entire Grid viewport tree.
current.vpPath
returns the viewport path to the current viewport.
current.transform
returns the transformation
matrix for the current viewport.
current.rotation
returns the (total) rotation
for the current viewport.
current.viewport() current.parent(n=1) current.vpTree(all=TRUE) current.vpPath() current.transform()
current.viewport() current.parent(n=1) current.vpTree(all=TRUE) current.vpPath() current.transform()
n |
The number of generations to go up. |
all |
A logical value indicating whether the entire viewport tree should be returned. |
It is possible to get the grandparent of the current viewport
(or higher) using the n
argument to current.parent()
.
The parent of the ROOT viewport is NULL
.
It is an error to request the grandparent of the ROOT viewport.
If all
is FALSE
then
current.vpTree
only returns the subtree below
the current viewport.
A Grid viewport object from current.viewport
or
current.vpTree
.
current.transform
returns a 4x4 transformation matrix.
The viewport path returned by current.vpPath
is NULL
if the current viewport is the ROOT
viewport
Paul Murrell
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() upViewport(1) current.vpPath() current.vpTree() current.viewport() current.vpTree(all=FALSE) popViewport(0)
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() upViewport(1) current.vpPath() current.vpTree() current.viewport() current.vpTree(all=FALSE) popViewport(0)
Determine the width and height of a raster grob when one or both are not given explicitly.
The result depends on both the aspect ratio of the raster image and the aspect ratio of the physical drawing context, so the result is only valid for the drawing context in which this function is called.
resolveRasterSize(x)
resolveRasterSize(x)
x |
A raster grob |
A raster grob can be specified with width and/or height of
NULL
, which means that the size at which the raster is
drawn will be decided at drawing time.
A raster grob, with explicit width and height.
# Square raster rg <- rasterGrob(matrix(0)) # Fill the complete page (if page is square) grid.newpage() resolveRasterSize(rg)$height grid.draw(rg) # Forced to fit tall thin region grid.newpage() pushViewport(viewport(width=.1)) resolveRasterSize(rg)$height grid.draw(rg)
# Square raster rg <- rasterGrob(matrix(0)) # Fill the complete page (if page is square) grid.newpage() resolveRasterSize(rg)$height grid.draw(rg) # Forced to fit tall thin region grid.newpage() pushViewport(viewport(width=.1)) resolveRasterSize(rg)$height grid.draw(rg)
Draw a single rectangle with rounded corners.
roundrectGrob(x=0.5, y=0.5, width=1, height=1, default.units="npc", r=unit(0.1, "snpc"), just="centre", name=NULL, gp=NULL, vp=NULL) grid.roundrect(...)
roundrectGrob(x=0.5, y=0.5, width=1, height=1, default.units="npc", r=unit(0.1, "snpc"), just="centre", name=NULL, gp=NULL, vp=NULL) grid.roundrect(...)
x , y , width , height
|
The location and size of the rectangle. |
default.units |
A string indicating the default units to use
if |
r |
The radius of the rounded corners. |
just |
The justification of the rectangle relative to its location. |
name |
A name to identify the grob. |
gp |
Graphical parameters to apply to the grob. |
vp |
A viewport object or |
... |
Arguments to be passed to |
At present, this function can only be used to draw one rounded rectangle.
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"))
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"))
Produces a graphical display of (by default) the current grid scene, with labels showing the names of each grob in the scene. It is also possible to label only specific grobs in the scene.
showGrob(x = NULL, gPath = NULL, strict = FALSE, grep = FALSE, recurse = TRUE, depth = NULL, labelfun = grobLabel, ...)
showGrob(x = NULL, gPath = NULL, strict = FALSE, grep = FALSE, recurse = TRUE, depth = NULL, labelfun = grobLabel, ...)
x |
If |
gPath |
A path identifying a subset of the current scene or grob to be labelled. |
strict |
Logical indicating whether the gPath is strict. |
grep |
Logical indicating whether the gPath is a regular expression. |
recurse |
Should the children of gTrees also be labelled? |
depth |
Only display grobs at the specified depth (may be a vector of depths). |
labelfun |
Function used to generate a label from each grob. |
... |
Arguments passed to |
None of the labelling is recorded on the grid display list so the
original scene can be reproduced by calling grid.refresh
.
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: # Examples from higher-level packages library(lattice) # Ctrl-c after first example example(histogram) showGrob() showGrob(gPath="plot_01.ylab") library(ggplot2) # Ctrl-c after first example example(qplot) showGrob() showGrob(recurse=FALSE) showGrob(gPath="panel-3-3") showGrob(gPath="axis.title", grep=TRUE) showGrob(depth=2) ## End(Not run)
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: # Examples from higher-level packages library(lattice) # Ctrl-c after first example example(histogram) showGrob() showGrob(gPath="plot_01.ylab") library(ggplot2) # Ctrl-c after first example example(qplot) showGrob() showGrob(recurse=FALSE) showGrob(gPath="panel-3-3") showGrob(gPath="axis.title", grep=TRUE) showGrob(depth=2) ## End(Not run)
Produces a graphical display of (by default) the current grid viewport tree. It is also possible to display only specific viewports. Each viewport is drawn as a rectangle and the leaf viewports are labelled with the viewport name.
showViewport(vp = NULL, recurse = TRUE, depth = NULL, newpage = FALSE, leaves = FALSE, col = rgb(0, 0, 1, 0.2), fill = rgb(0, 0, 1, 0.1), label = TRUE, nrow = 3, ncol = nrow)
showViewport(vp = NULL, recurse = TRUE, depth = NULL, newpage = FALSE, leaves = FALSE, col = rgb(0, 0, 1, 0.2), fill = rgb(0, 0, 1, 0.1), label = TRUE, nrow = 3, ncol = nrow)
vp |
If |
recurse |
Should the children of the specified viewport also be displayed? |
depth |
Only display viewports at the specified depth (may be a vector of depths). |
newpage |
Start a new page for the display? Otherwise, the viewports are displayed on top of the current plot. |
leaves |
Produce a matrix of smaller displays, with each leaf viewport in its own display. |
col |
The colour used to draw the border of the rectangle for each viewport and to draw the label for each viewport. If a vector, then the first colour is used for the top-level viewport, the second colour is used for its children, the third colour for their children, and so on. |
fill |
The colour used to fill each viewport. May be a vector as per
|
label |
Should the viewports be labelled (with the viewport name)? |
nrow , ncol
|
The number of rows and columns when |
viewport
and
grid.show.viewport
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)
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)
These functions create a unit object describing the width or height of a string.
stringWidth(string) stringHeight(string) stringAscent(string) stringDescent(string)
stringWidth(string) stringHeight(string) stringAscent(string) stringDescent(string)
string |
A character vector or a language object (as used for ‘plotmath’ calls). |
A unit
object.
Paul Murrell
strwidth
in the graphics package for more details of the
typographic concepts behind the computations.
This function creates a unit object — a vector of unit values. A unit value is typically just a single numeric value with an associated unit.
unit(x, units, data=NULL) is.unit(x)
unit(x, units, data=NULL) is.unit(x)
x |
A numeric vector. For |
units |
A character vector specifying the units for the corresponding numeric values. |
data |
This argument is used to supply extra information
for special |
Unit objects allow the user to specify locations and dimensions
in a large number of different coordinate systems. All drawing
occurs relative to a viewport and the units
specifies
what coordinate system to use within that viewport.
Possible units
(coordinate systems) are:
"npc"
Normalised Parent Coordinates (the default). The origin of the viewport is (0, 0) and the viewport has a width and height of 1 unit. For example, (0.5, 0.5) is the centre of the viewport.
"cm"
Centimetres.
"inches"
Inches. 1 in = 2.54 cm.
"mm"
Millimetres. 10 mm = 1 cm.
"points"
Points. 72.27 pt = 1 in.
"picas"
Picas. 1 pc = 12 pt.
"bigpts"
Big Points. 72 bp = 1 in.
"dida"
Dida. 1157 dd = 1238 pt.
"cicero"
Cicero. 1 cc = 12 dd.
"scaledpts"
Scaled Points. 65536 sp = 1 pt.
"lines"
Lines of text. Locations and dimensions
are in terms of multiples of the default text size of the viewport
(as specified by the viewport's fontsize
and lineheight
).
"char"
Multiples of nominal font height of the
viewport (as specified by the viewport's fontsize
).
"native"
Locations and dimensions are relative to
the viewport's xscale
and yscale
.
"snpc"
Square Normalised Parent Coordinates. Same as Normalised Parent Coordinates, except gives the same answer for horizontal and vertical locations/dimensions. It uses the lesser of npc-width and npc-height. This is useful for making things which are a proportion of the viewport, but have to be square (or have a fixed aspect ratio).
"strwidth"
Multiples of the width of the string
specified in the data
argument. The font size is
determined by the pointsize of the viewport.
"strheight"
Multiples of the height of the string
specified in the data
argument. The font size is
determined by the pointsize of the viewport.
"grobwidth"
Multiples of the width of the grob
specified in the data
argument.
"grobheight"
Multiples of the height of the grob
specified in the data
argument.
A number of variations are also allowed for the most common units.
For example, it is possible to use "in"
or "inch"
instead of "inches"
and "centimetre"
or
"centimeter"
instead of "cm"
.
A special units
value of "null"
is also allowed,
but only makes sense when used in specifying widths of columns
or heights of rows in grid layouts (see grid.layout
).
The data
argument must be a list when the unit.length()
is greater than 1. For example,
unit(rep(1, 3), c("npc", "strwidth", "inches"), data = list(NULL, "my string", NULL))
.
It is possible to subset unit objects in the normal way and to perform
subassignment (see the examples),
but a special function
unit.c
is provided for combining unit objects.
Certain arithmetic and summary operations are defined for
unit objects. In particular, it is possible to add and subtract
unit objects (e.g., unit(1, "npc") - unit(1, "inches")
),
and to specify the minimum or maximum of a list
of unit objects (e.g., min(unit(0.5, "npc"), unit(1,
"inches"))
).
There is a format
method for units, which should respond to
the arguments for the default format
method, e.g.,
digits
to control the number of significant digits
printed for numeric values.
The is.unit()
function is a convenience for checking whether
x
inherits from the "unit"
class.
An object of class "unit"
.
There is a special function unit.c
for concatenating
several unit objects.
The c
function will not give the right answer.
There used to be "mylines"
, "mychar"
, "mystrwidth"
,
"mystrheight"
units. These will still be accepted, but
work exactly the same as
"lines"
, "char"
, "strwidth"
,
"strheight"
.
Paul Murrell
unit(1, "npc") unit(1:3/4, "npc") unit(1:3/4, "npc") + unit(1, "inches") min(unit(0.5, "npc"), unit(1, "inches")) unit.c(unit(0.5, "npc"), unit(2, "inches") + unit(1:3/4, "npc"), unit(1, "strwidth", "hi there")) x <- unit(1:5, "npc") x[2:4] x[2:4] <- unit(1, "mm") x
unit(1, "npc") unit(1:3/4, "npc") unit(1:3/4, "npc") + unit(1, "inches") min(unit(0.5, "npc"), unit(1, "inches")) unit.c(unit(0.5, "npc"), unit(2, "inches") + unit(1:3/4, "npc"), unit(1, "strwidth", "hi there")) x <- unit(1:5, "npc") x[2:4] x[2:4] <- unit(1, "mm") x
This function produces a new unit object by combining the unit objects specified as arguments.
unit.c(..., check = TRUE)
unit.c(..., check = TRUE)
... |
An arbitrary number of unit objects. |
check |
Should input be checked? If you are certain all arguments are unit objects this can be set to |
An object of class unit
.
Paul Murrell
unit
.
The length of a unit object is defined as the number of unit values in the unit object.
This function has been deprecated in favour of a unit method for
the generic length
function.
unit.length(unit)
unit.length(unit)
unit |
A unit object. |
An integer value.
Paul Murrell
length(unit(1:3, "npc")) length(unit(1:3, "npc") + unit(1, "inches")) length(max(unit(1:3, "npc") + unit(1, "inches"))) length(max(unit(1:3, "npc") + unit(1, "strwidth", "a"))*4) length(unit(1:3, "npc") + unit(1, "strwidth", "a")*4)
length(unit(1:3, "npc")) length(unit(1:3, "npc") + unit(1, "inches")) length(max(unit(1:3, "npc") + unit(1, "inches"))) length(max(unit(1:3, "npc") + unit(1, "strwidth", "a"))*4) length(unit(1:3, "npc") + unit(1, "strwidth", "a")*4)
Returns a unit object whose i-th value is the minimum (or maximum) of the i-th values of the arguments.
unit.pmin(...) unit.pmax(...) unit.psum(...)
unit.pmin(...) unit.pmax(...) unit.psum(...)
... |
One or more unit objects. |
The length of the result is the maximum of the lengths of the arguments; shorter arguments are recycled in the usual manner.
A unit object.
Paul Murrell
max(unit(1:3, "cm"), unit(0.5, "npc")) unit.pmax(unit(1:3, "cm"), unit(0.5, "npc"))
max(unit(1:3, "cm"), unit(0.5, "npc")) unit.pmax(unit(1:3, "cm"), unit(0.5, "npc"))
Replicates the units according to the values given in times
and
length.out
.
This function has been deprecated in favour of a unit method for
the generic rep
function.
unit.rep(x, ...)
unit.rep(x, ...)
x |
An object of class |
... |
arguments to be passed to |
An object of class "unit"
.
Paul Murrell
rep(unit(1:3, "npc"), 3) rep(unit(1:3, "npc"), 1:3) rep(unit(1:3, "npc") + unit(1, "inches"), 3) rep(max(unit(1:3, "npc") + unit(1, "inches")), 3) rep(max(unit(1:3, "npc") + unit(1, "strwidth", "a"))*4, 3) rep(unit(1:3, "npc") + unit(1, "strwidth", "a")*4, 3)
rep(unit(1:3, "npc"), 3) rep(unit(1:3, "npc"), 1:3) rep(unit(1:3, "npc") + unit(1, "inches"), 3) rep(max(unit(1:3, "npc") + unit(1, "inches")), 3) rep(max(unit(1:3, "npc") + unit(1, "strwidth", "a"))*4, 3) rep(unit(1:3, "npc") + unit(1, "strwidth", "a")*4, 3)
This function returns the units of a unit object.
unitType(x, recurse = FALSE)
unitType(x, recurse = FALSE)
x |
A unit object. |
recurse |
Whether to recurse into complex units. |
For simple units, this will be just a vector of coordinate systems,
like "inches"
or "npc"
.
More complex units that involve
an operation on units return
an operator, like "sum"
, "min"
, or "max"
.
When recurse = TRUE
, the result is always a list and
more complex units generate sublists (see the Examples below).
Thomas Lin Pedersen and Paul Murrell
u <- unit(1:5, c("cm", "mm", "in", "pt", "null")) unitType(u) unitType(unit(1, "npc")) unitType(unit(1:3/4, "npc")) unitType(unit(1:3/4, "npc") + unit(1, "inches")) unitType(min(unit(0.5, "npc"), unit(1, "inches"))) unitType(unit.c(unit(0.5, "npc"), unit(2, "inches") + unit(1:3/4, "npc"), unit(1, "strwidth", "hi there"))) unitType(min(unit(1, "in"), unit(1, "npc") + unit(1, "mm"))) unitType(u, recurse=TRUE) unitType(unit(1, "npc"), recurse=TRUE) unitType(unit(1:3/4, "npc"), recurse=TRUE) unitType(unit(1:3/4, "npc") + unit(1, "inches"), recurse=TRUE) unitType(min(unit(0.5, "npc"), unit(1, "inches")), recurse=TRUE) unitType(unit.c(unit(0.5, "npc"), unit(2, "inches") + unit(1:3/4, "npc"), unit(1, "strwidth", "hi there")), recurse=TRUE) unitType(min(unit(1, "in"), unit(1, "npc") + unit(1, "mm")), recurse=TRUE) unlist(unitType(min(unit(1, "in"), unit(1, "npc") + unit(1, "mm")), recurse=TRUE))
u <- unit(1:5, c("cm", "mm", "in", "pt", "null")) unitType(u) unitType(unit(1, "npc")) unitType(unit(1:3/4, "npc")) unitType(unit(1:3/4, "npc") + unit(1, "inches")) unitType(min(unit(0.5, "npc"), unit(1, "inches"))) unitType(unit.c(unit(0.5, "npc"), unit(2, "inches") + unit(1:3/4, "npc"), unit(1, "strwidth", "hi there"))) unitType(min(unit(1, "in"), unit(1, "npc") + unit(1, "mm"))) unitType(u, recurse=TRUE) unitType(unit(1, "npc"), recurse=TRUE) unitType(unit(1:3/4, "npc"), recurse=TRUE) unitType(unit(1:3/4, "npc") + unit(1, "inches"), recurse=TRUE) unitType(min(unit(0.5, "npc"), unit(1, "inches")), recurse=TRUE) unitType(unit.c(unit(0.5, "npc"), unit(2, "inches") + unit(1:3/4, "npc"), unit(1, "strwidth", "hi there")), recurse=TRUE) unitType(min(unit(1, "in"), unit(1, "npc") + unit(1, "mm")), recurse=TRUE) unlist(unitType(min(unit(1, "in"), unit(1, "npc") + unit(1, "mm")), recurse=TRUE))
Utility functions for determining whether a justification specification is valid and for resolving a single justification value from a combination of character and numeric values.
valid.just(just) resolveHJust(just, hjust) resolveVJust(just, vjust)
valid.just(just) resolveHJust(just, hjust) resolveVJust(just, vjust)
just |
A justification either as a character value,
e.g., |
hjust |
A numeric horizontal justification |
vjust |
A numeric vertical justification |
These functions may be useful within a validDetails
method
when writing a new grob class.
A numeric representation of the justification (e.g.,
"left"
becomes 0, "right"
becomes 1, etc, ...).
An error is given if the justification is not valid.
Paul Murrell
This generic hook function is called whenever a grid grob is created
or
edited
via grob
, gTree
, grid.edit
or editGrob
.
This provides an opportunity for customising the validation of a
new class derived from grob (or gTree).
validDetails(x)
validDetails(x)
x |
A grid grob. |
This function is called by grob
, gTree
,
grid.edit
and editGrob
.
A method should be written for classes derived from grob or gTree
to validate the values of slots specific to the new class.
(e.g., see grid:::validDetails.axis
).
Note that the standard slots for grobs and gTrees are automatically
validated (e.g., vp
, gp
slots for grobs and,
in addition, children
, and childrenvp
slots for
gTrees) so only slots specific to a new class need to be addressed.
The function MUST return the validated grob.
Paul Murrell
These functions define the transformation that will be applied
when a grid.define()
d group is grid.use()
d.
viewportTransform(group, shear=groupShear(), flip=groupFlip(), device=TRUE) viewportTranslate(group, device=TRUE) viewportScale(group, device=TRUE) viewportRotate(group, device=TRUE) defnTranslate(group, inverse=FALSE, device=TRUE) defnScale(group, inverse=FALSE) defnRotate(group, inverse=FALSE, device=TRUE) useTranslate(inverse=FALSE, device=TRUE) useScale(inverse=FALSE) useRotate(inverse=FALSE, device=TRUE) groupTranslate(dx=0, dy=0) groupRotate(r=0, device=TRUE) groupScale(sx=1, sy=1) groupShear(sx=0, sy=0) groupFlip(flipX=FALSE, flipY=FALSE)
viewportTransform(group, shear=groupShear(), flip=groupFlip(), device=TRUE) viewportTranslate(group, device=TRUE) viewportScale(group, device=TRUE) viewportRotate(group, device=TRUE) defnTranslate(group, inverse=FALSE, device=TRUE) defnScale(group, inverse=FALSE) defnRotate(group, inverse=FALSE, device=TRUE) useTranslate(inverse=FALSE, device=TRUE) useScale(inverse=FALSE) useRotate(inverse=FALSE, device=TRUE) groupTranslate(dx=0, dy=0) groupRotate(r=0, device=TRUE) groupScale(sx=1, sy=1) groupShear(sx=0, sy=0) groupFlip(flipX=FALSE, flipY=FALSE)
group |
The group that is being transformed. |
inverse |
A logical indicating whether we want the forward or backward transformation. |
shear |
An affine transformation matrix that describes a shear transformation. |
flip |
An affine transformation matrix that describes a scaling inversion. |
dx , dy
|
The translation to apply. |
r |
The rotation to apply. |
sx , sy
|
The scaling (or shear) to apply. |
flipX , flipY
|
Whether to negate the x-scaling or y-scaling (logical). |
device |
A logical indicating whether transformation should be relative to the device or relative to the current viewport. |
The viewport*()
functions are not called directly. They
are passed as the transform
argument to
grid.use
.
The defn*()
and use*()
functions are also not called
directly, but can be useful to create custom transformation
functions. For example, see the source code for
viewportTransform
.
The group*()
functions generate basic affine transformation
matrices and may also be useful to create custom transformation
functions. For example, the groupShear()
function can be
used to specify a shear transform to viewportTransform()
.
It is also possible to define any function that returns a 3x3 matrix
(as long as the last column contains 0, 0, and 1)
and use it as the transform
argument to
grid.use
, but the results will probably be
device-dependent, and may be very difficult
to predict. The function will be called with two arguments:
group
and device
.
An affine transformation matrix.
Paul Murrell
## 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()
## 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()
This function can be used to generate a viewport path for use
in downViewport
or seekViewport
.
A viewport path is a list of nested viewport names.
vpPath(...)
vpPath(...)
... |
Character values which are viewport names. |
Viewport names must only be unique amongst viewports which share the same parent in the viewport tree.
This function can be used to generate a specification for a viewport that includes the viewport's parent's name (and the name of its parent and so on).
For interactive use, it is possible to directly specify a path, but it is strongly recommended that this function is used otherwise in case the path separator is changed in future versions of grid.
A vpPath
object.
viewport
,
pushViewport
,
popViewport
,
downViewport
,
seekViewport
,
upViewport
vpPath("vp1", "vp2")
vpPath("vp1", "vp2")
These generic functions are used to determine the size of grid grobs.
widthDetails(x) heightDetails(x) ascentDetails(x) descentDetails(x)
widthDetails(x) heightDetails(x) ascentDetails(x) descentDetails(x)
x |
A grid grob. |
These functions are called in the calculation of
"grobwidth"
and "grobheight"
units.
Methods should be written for classes derived from grob or gTree
where the size of the grob can be determined (see, for example
grid:::widthDetails.frame
).
The ascent of a grob is the height of the grob by default and the descent of a grob is zero by default, except for text grobs where the label is a single character value or expression.
A unit object.
Paul Murrell
Grid maintains a tree of viewports — nested drawing contexts.
These functions provide ways to add or remove viewports and to navigate amongst viewports in the tree.
pushViewport(..., recording=TRUE) popViewport(n = 1, recording=TRUE) downViewport(name, strict=FALSE, recording=TRUE) seekViewport(name, recording=TRUE) upViewport(n = 1, recording=TRUE)
pushViewport(..., recording=TRUE) popViewport(n = 1, recording=TRUE) downViewport(name, strict=FALSE, recording=TRUE) seekViewport(name, recording=TRUE) upViewport(n = 1, recording=TRUE)
... |
One or more objects of class |
n |
An integer value indicating how many viewports to
pop or navigate up. The special value |
name |
A character value to identify a viewport in the tree. |
strict |
A boolean indicating whether the vpPath must be matched exactly. |
recording |
A logical value to indicate whether the viewport operation should be recorded on the Grid display list. |
Objects created by the viewport()
function are only
descriptions
of a drawing context. A viewport object must be pushed onto the
viewport tree before it has any effect on drawing.
The viewport tree always has a single root viewport (created by the
system) which corresponds to the entire device (and default
graphical parameter settings). Viewports may be added to the tree
using pushViewport()
and removed from the tree using
popViewport()
.
There is only ever one current viewport, which is the current
position within the viewport tree. All drawing and
viewport operations are relative to the current viewport.
When a viewport is pushed it becomes the current viewport.
When a viewport is popped, the parent viewport becomes
the current viewport. Use upViewport
to navigate to the parent
of the current viewport, without removing the current viewport
from the viewport tree. Use downViewport
to navigate to
a viewport further down the viewport tree and seekViewport
to navigate to a viewport anywhere else in the tree.
If a viewport is pushed and it has the same name
as a
viewport at the same level in the tree, then it replaces the
existing viewport in the tree.
downViewport
returns the number of viewports it went down.
This can be useful for returning to your starting point by doing
something like depth <- downViewport()
then
upViewport(depth)
.
Paul Murrell
# 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)
# 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)
These generic functions are used to determine a location on the boundary of a grid grob.
xDetails(x, theta) yDetails(x, theta)
xDetails(x, theta) yDetails(x, theta)
x |
A grid grob. |
theta |
A numeric angle, in degrees, measured
anti-clockwise from the 3 o'clock or one of
the following character strings: |
The location on the grob boundary is determined by taking
a line from the centre of the grob at the angle theta
and intersecting it with the convex hull of the grob
(for the basic
grob primitives, the centre is
determined as half way between the minimum and maximum values
in x and y directions).
These functions are called in the calculation of
"grobx"
and "groby"
units as produced by
the grobX
and grobY
functions.
Methods should be written for classes derived from grob or gTree
where the boundary of the grob can be determined.
A unit object.
Paul Murrell
Rather than drawing an xspline (or Bezier curve), this function returns the points that would be used to draw the series of line segments for the xspline. This may be useful to post-process the xspline curve, for example, to clip the curve.
xsplinePoints(x) bezierPoints(x)
xsplinePoints(x) bezierPoints(x)
x |
An xspline grob, as produced by the |
The points returned by this function will only be relevant for the drawing context in force when this function was called.
Depends on how many xsplines would be drawn. If only one, then a list with two components, named x and y, both of which are unit objects (in inches). If several xsplines would be drawn then the result of this function is a list of lists.
Paul Murrell
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"))
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"))