| % File src/library/grid/vignettes/locndimn.Rnw |
| % Part of the R package, https://www.R-project.org |
| % Copyright 2001-13 Paul Murrell and the R Core Team |
| % Distributed under GPL 2 or later |
| |
| \documentclass[a4paper]{article} |
| %\VignetteIndexEntry{Locations versus Dimensions} |
| %\VignettePackage{grid} |
| \setlength{\parindent}{0in} |
| \setlength{\parskip}{.1in} |
| \setlength{\textwidth}{140mm} |
| \setlength{\oddsidemargin}{10mm} |
| |
| \newcommand{\code}[1]{\texttt{#1}} |
| \newcommand{\pkg}[1]{{\normalfont\fontseries{b}\selectfont #1}} |
| \newcommand{\grid}{\pkg{grid}} |
| |
| \title{The difference between Locations and Dimensions in \grid{}} |
| \author{Paul Murrell} |
| |
| \begin{document} |
| |
| \maketitle |
| |
| <<echo=FALSE, results=hide>>= |
| library(grDevices) |
| library(grid) |
| ps.options(pointsize = 12) |
| options(width = 60) |
| @ |
| \grid{} makes use of unit objects to express both the locations and |
| dimensions of graphical components. For example, the \code{grid.rect()} |
| function treats its x- and y-arguments as locations within the current |
| viewport, and its width- and height-arguments as dimensions within the |
| current viewport. |
| |
| These different interpretations of units are usually implicit like this; |
| if its an x- or y-value then its a location, if its a width- or height-value |
| then its a dimension. |
| |
| The distinction is made at all because, in some coordinate systems, notably |
| \code{"native"} coordinates, the location $x$ can have a very different |
| meaning |
| from the dimension $x$ -- basically, whenever the minimum value of the |
| coordinate system is not zero. |
| |
| In the specification of simple units, the difference between locations |
| and dimensions is often not noticeable. However, there are a couple |
| of tricky areas: |
| |
| \begin{enumerate} |
| \item When adding (or performing any arithmetic operation on) units, |
| it is important to keep in mind that locations are added like vectors |
| and dimensions are added like lengths. The following |
| diagram demonstrates the difference: |
| |
| <<fig=TRUE, echo=FALSE, results=hide>>= |
| diagram.locn <- function(i, n, locn) { |
| x <- i/(n+1) |
| grid.lines(x = unit(rep(x, 2), "npc"), |
| y = unit.c(unit(0, "npc"), locn)) |
| grid.lines(x = unit(x, "npc") + unit(c(-2, 0, 2), "mm"), |
| y = locn + unit(c(-2, 0, -2), "mm")) |
| grid.text(paste(as.character(locn), "as a location"), |
| x = unit(x, "npc") - unit(1, "mm"), |
| y = locn - unit(3, "mm"), |
| just = c("right", "bottom"), |
| rot = 90) |
| } |
| diagram.dimn <- function(i, n, dimn) { |
| x <- i/(n+1) |
| pushViewport(viewport(x = unit(x, "npc"), y = unit(0, "native"), |
| h = dimn, w = unit(1, "lines"), just = c("centre", "bottom"))) |
| grid.rect() |
| grid.text(paste(as.character(dimn), "as a dimension"), |
| rot = 90) |
| popViewport() |
| } |
| pushViewport(viewport(w = 0.8, y=unit(1.7, "inches"), |
| h = unit(4, "inches"), |
| just = c("centre", "bottom"), |
| yscale = c(-0.6, 1.3))) |
| grid.grill(v = c(0, 1), h = seq(-0.5, 1, 0.5), default.units = "native") |
| grid.rect() |
| grid.yaxis() |
| n <- 10 |
| diagram.locn(1, n, unit(1, "native")) |
| diagram.locn(2, n, unit(-0.4, "native")) |
| diagram.locn(3, n, unit(0.4, "native")) |
| diagram.locn(4, n, unit(1, "native") + unit(-0.4, "native")) |
| diagram.locn(5, n, unit(1, "native") - unit(0.4, "native")) |
| diagram.dimn(6, n, unit(1, "native")) |
| diagram.dimn(7, n, unit(-0.4, "native")) |
| diagram.dimn(8, n, unit(0.4, "native")) |
| diagram.dimn(9, n, unit(1, "native") + unit(-0.4, "native")) |
| diagram.dimn(10, n, unit(1, "native") - unit(0.4, "native")) |
| @ |
| \item The functions \code{convertX}, |
| \code{convertY}, \code{convertWidth}, \code{convertHeight} |
| are used to convert from one coordinate system to another. |
| Again, it is important whether the conversion is for a location or |
| for a dimension. |
| The following code |
| demonstrates some results from these functions based on a similar |
| situation to that in the preceding diagram: |
| |
| <<fig=FALSE>>= |
| pushViewport(viewport(yscale = c(-0.6, 1.3))) |
| # Unexpected results? |
| convertY(unit(1,'native'), "native") |
| convertY(unit(-.4,'native'), "native") |
| convertY(unit(1,'native')+unit(-.4,'native'), "native") |
| convertY(unit(1,'native')-unit(.4,'native'), "native") |
| # Expected results |
| convertHeight(unit(1,'native'), "native") |
| convertHeight(unit(-.4,'native'), "native") |
| convertHeight(unit(1,'native')+unit(-.4,'native'), "native") |
| convertHeight(unit(1,'native')-unit(.4,'native'), "native") |
| popViewport() |
| @ |
| \end{enumerate} |
| \end{document} |