Learn R Programming

sfsmisc (version 1.1-19)

pretty10exp: Nice 10 ** k Label Expressions

Description

Produce nice \(a \times 10^k\) expressions to be used instead of the scientific notation "a E<k>".

Usage

pretty10exp(x, drop.1 = FALSE, sub10 = FALSE, digits = 7, digits.fuzz,
            off = pmax(10^-digits, 2^-(l10x*log2(10)+1075)),
            lab.type = c("plotmath","latex"),
            lab.sep = c("cdot", "times"))

Value

For the default lab.type = "plotmath", an expression of the same length as x, typically with elements of the form a %*% 10 ^ k. Exceptions are 0 which is kept simple, if drop.1 is true and \(a = 1\), 10 ^ k is used, and if sub10

is not false, a %*% 10 ^ 0 as a, and a %*% 10 ^ k as as the corresponding formatted number a * 10^k independently of

drop.1.

Otherwise, a character vector of the same length as

x. For lab.type = "latex", currently the only alternative to the default, these strings are LaTeX (math mode) compatible strings.

Arguments

x

numeric vector (e.g. axis tick locations)

drop.1

logical indicating if \(1 \times\) should be dropped from the resulting expressions.

sub10

logical, "10", a non-negative integer number or an integer vector of length two, say \((k_1,k_2)\), indicating if some \(10^j\) expressions for \(j \in J\) should be formatted traditionally, notably e.g., \(10^0 \equiv 1\).
When a (non-negative) number, say \(k\), \(J = \{j; j \le k\}\) are all simplified, when a length--2 vector, \(J = \{j; k_1 \le j \le k_2\}\) are.

Special cases: sub10 = TRUE means to use \(1\) instead of \(10^0\) and sub10 = "10" uses both \(1\) for \(10^0\) and \(10\) for \(10^1\); these are short forms of sub10 = c(0,0) and sub10 = c(0,1) respectively.

digits

number of digits for mantissa (\(a\)) construction; the number of significant digits, see signif.

digits.fuzz

the old deprecated name for digits.

off

a numeric offset in eT <- floor(l10x + off) where l10x <- log10(abs(x)) and eT are the exponents \(k\) for label factors \(10^k\). Previously hardcoded to 10^-digits, the new default provides better results for subnormal abs(x) values.

lab.type

a string indicating how the result should look like. By default, (plotmath-compatible) expressions are returned. Alternatively, lab.type = "plotmath" returns LaTeX formatted strings for labels. (The latter is useful, e.g., when using the tikzDevice package to generate LaTeX-processed figures.)

lab.sep

character separator between mantissa and exponent for LaTeX labels; it will be prepended with a backslash, i.e., ‘"cdot"’ will use ‘"\cdot"’

Author

Martin Maechler; Ben Bolker contributed lab.type = "latex" and lab.sep.

See Also

axTexpr and eaxis() which build on pretty10exp(), notably the eaxis() example plots.

The new toLatex.numeric method which gives very similar results with option scientific = TRUE.
Further, axis, axTicks.

Examples

Run this code
pretty10exp(-1:3 * 1000)
pretty10exp(-1:3 * 1000, drop.1 = TRUE)
pretty10exp(c(1,2,5,10,20,50,100,200) * 1e3)
pretty10exp(c(1,2,5,10,20,50,100,200) * 1e3, drop.1 = TRUE)

set.seed(17); lx <- rlnorm(10, m=8, s=6)
pretty10exp(lx, digits = 3)
pretty10exp(lx, digits = 3, sub10 = 2)

pretty10exp(lx, digits = 3, lab.type="latex")
pretty10exp(lx, digits = 3, lab.type="latex", lab.sep="times", sub10=2)

## use regular formatted numbers from 0.03 to 300 :
pretty10exp(3*10^(-3:4), sub10 = c(-2,2))
pretty10exp(3*10^(-3:4), sub10 = c(-2,2), lab.type = "l")

# \dontshow{
stopifnot(identical(pretty10exp(numeric(0)), expression()))
# }
ax <- 10^(-6:0) - 2e-16
pretty10exp(ax, drop.1=TRUE) # nice for plotting
pretty10exp(ax, drop.1=TRUE, sub10=TRUE)
pretty10exp(ax, drop.1=TRUE, sub10=c(-2,2))

## in sfsmisc version <= 1.0-16, no 'digits',
## i.e., implicitly had  digits := #{double precision digits} ==
(dig. <- .Machine$double.digits * log10(2)) # 15.95
pretty10exp(ax, drop.1=TRUE, digits= dig.)  # ''ugly''

## Subnormal numbers
x <- sort(c(outer(10^-(323:305), 1:9))); x <- c(x[1]/2, x)
tail(x, 12) # nice
head(x, 6)  # "ugly" (they are multiple's of 2^-1074):
head(x, 6) / 2^-1074  # nice

head(p0 <- pretty10exp(x, off = 10^-7), 30) # previous behavior {before 'off' existed}
str(head(pTen <- lapply(p0, `[[`, 3L)))
str(exTen <- sapply(pTen, `[[`, 3L)) # -324 -324 ..
head(f0 <- sapply(p0, `[[`, 2L), 17)

head(p1 <- pretty10exp(x))# new default
str(head(pTen1 <- lapply(p1, `[[`, 3L)))
str(exTen1 <- sapply(pTen1, `[[`, 3L)) # -324 -324 ..
head(f1 <- sapply(p1, `[[`, 2L), 17)   #

head(cbind(x, f0, f1, exTen, exTen1), 80)
(nEQ <- which(sapply(1:length(p0), function(i) p0[[i]] != p1[[i]])))
cbind(x, f0, f1, exTen, exTen1)[nEQ,]
stopifnot(is.finite(f1), 0.5 <= f1, f1 <= 9)

Run the code above in your browser using DataLab