123 lines
4.3 KiB
Plaintext
123 lines
4.3 KiB
Plaintext
|
% 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}
|