Title: | The R Graphics Devices and Support for Colours and Fonts |
---|---|
Description: | Graphics devices and support for base and grid graphics. |
Authors: | R Core Team and contributors worldwide |
Maintainer: | R Core Team <[email protected]> |
License: | Part of R 4.4.1 |
Version: | 4.4.1 |
Built: | 2024-06-15 17:27:20 UTC |
Source: | base |
Graphics devices and support for base and grid graphics
This package contains functions which support both base and grid graphics.
For a complete list of functions, use library(help = "grDevices")
.
R Core Team and contributors worldwide
Maintainer: R Core Team [email protected]
Adjust or modify a vector of colors by “turning knobs” on one or more
coordinates in space, typically by up or down
scaling them.
adjustcolor(col, alpha.f = 1, red.f = 1, green.f = 1, blue.f = 1, offset = c(0, 0, 0, 0), transform = diag(c(red.f, green.f, blue.f, alpha.f)))
adjustcolor(col, alpha.f = 1, red.f = 1, green.f = 1, blue.f = 1, offset = c(0, 0, 0, 0), transform = diag(c(red.f, green.f, blue.f, alpha.f)))
col |
vector of colors, in any format that |
alpha.f |
factor modifying the opacity alpha; typically in [0,1] |
red.f , green.f , blue.f
|
factors modifying the “red-”, “green-” or “blue-”ness of the colors, respectively. |
offset |
numeric vector of length 4 to offset |
transform |
a 4x4 numeric matrix applied to |
a color vector of the same length as col
, effectively the
result of rgb()
.
rgb
, col2rgb
. For more sophisticated
color constructions: convertColor
## Illustrative examples : opal <- palette("default") stopifnot(identical(adjustcolor(1:8, 0.75), adjustcolor(palette(), 0.75))) cbind(palette(), adjustcolor(1:8, 0.75)) ## alpha = 1/2 * previous alpha --> opaque colors x <- palette(adjustcolor(palette(), 0.5)) sines <- outer(1:20, 1:4, function(x, y) sin(x / 20 * pi * y)) matplot(sines, type = "b", pch = 21:23, col = 2:5, bg = 2:5, main = "Using an 'opaque ('translucent') color palette") x. <- adjustcolor(x, offset = c(0.5, 0.5, 0.5, 0), # <- "more white" transform = diag(c(.7, .7, .7, 0.6))) cbind(x, x.) op <- par(bg = adjustcolor("goldenrod", offset = -rep(.4, 4)), xpd = NA) plot(0:9, 0:9, type = "n", axes = FALSE, xlab = "", ylab = "", main = "adjustcolor() -> translucent") text(1:8, labels = paste0(x,"++"), col = x., cex = 8) par(op) ## and (M <- cbind( rbind( matrix(1/3, 3, 3), 0), c(0, 0, 0, 1))) adjustcolor(x, transform = M) ## revert to previous palette: active palette(opal)
## Illustrative examples : opal <- palette("default") stopifnot(identical(adjustcolor(1:8, 0.75), adjustcolor(palette(), 0.75))) cbind(palette(), adjustcolor(1:8, 0.75)) ## alpha = 1/2 * previous alpha --> opaque colors x <- palette(adjustcolor(palette(), 0.5)) sines <- outer(1:20, 1:4, function(x, y) sin(x / 20 * pi * y)) matplot(sines, type = "b", pch = 21:23, col = 2:5, bg = 2:5, main = "Using an 'opaque ('translucent') color palette") x. <- adjustcolor(x, offset = c(0.5, 0.5, 0.5, 0), # <- "more white" transform = diag(c(.7, .7, .7, 0.6))) cbind(x, x.) op <- par(bg = adjustcolor("goldenrod", offset = -rep(.4, 4)), xpd = NA) plot(0:9, 0:9, type = "n", axes = FALSE, xlab = "", ylab = "", main = "adjustcolor() -> translucent") text(1:8, labels = paste0(x,"++"), col = x., cex = 8) par(op) ## and (M <- cbind( rbind( matrix(1/3, 3, 3), 0), c(0, 0, 0, 1))) adjustcolor(x, transform = M) ## revert to previous palette: active palette(opal)
Coerce an R object into a form suitable for graphics annotation.
as.graphicsAnnot(x)
as.graphicsAnnot(x)
x |
an R object |
Expressions, calls and names (as used by plotmath) are passed
through unchanged. All other objects with an explicit class (as
determined by is.object
) are coerced by
as.character
to character vectors.
All the graphics and grid functions which use this coerce calls and names to expressions internally.
A language object or a character vector.
Functions to create a raster object (representing a bitmap image) and coerce other objects to a raster object.
is.raster(x) as.raster(x, ...) ## S3 method for class 'matrix' as.raster(x, max = 1, ...) ## S3 method for class 'array' as.raster(x, max = 1, ...) ## S3 method for class 'logical' as.raster(x, max = 1, ...) ## S3 method for class 'numeric' as.raster(x, max = 1, ...) ## S3 method for class 'character' as.raster(x, max = 1, ...) ## S3 method for class 'raw' as.raster(x, max = 255L, ...)
is.raster(x) as.raster(x, ...) ## S3 method for class 'matrix' as.raster(x, max = 1, ...) ## S3 method for class 'array' as.raster(x, max = 1, ...) ## S3 method for class 'logical' as.raster(x, max = 1, ...) ## S3 method for class 'numeric' as.raster(x, max = 1, ...) ## S3 method for class 'character' as.raster(x, max = 1, ...) ## S3 method for class 'raw' as.raster(x, max = 255L, ...)
x |
any R object. |
max |
number giving the maximum of the color values range. |
... |
further arguments passed to or from other methods. |
An object of class "raster"
is a matrix of colour values as
given by rgb
representing a bitmap image.
It is not expected that the user will need to call these functions
directly; functions to render bitmap images in graphics packages will
make use of the as.raster()
function to generate a raster
object from their input.
The as.raster()
function is (S3) generic so methods can be
written to convert other R objects to a raster object.
The default implementation for numeric matrices interprets scalar values on black-to-white scale.
Raster objects can be subsetted like a matrix and it is possible to assign to a subset of a raster object.
There is a method for converting a raster object to a
matrix
(of colour strings).
Raster objects can be compared for equality or inequality (with each other or with a colour string).
There is a is.na
method which returns a logical matrix
of the same dimensions as the raster object. Note that NA
values are interpreted as the fully transparent colour by some (but
not all) graphics devices.
For as.raster()
, a raster object.
For is.raster()
, a logical indicating whether
x
is a raster object.
Raster images are internally represented row-first, which can cause confusion when trying to manipulate a raster object. The recommended approach is to coerce a raster to a matrix, perform the manipulation, then convert back to a raster.
# A red gradient as.raster(matrix(hcl(0, 80, seq(50, 80, 10)), nrow = 4, ncol = 5)) # Vectors are 1-column matrices ... # character vectors are color names ... as.raster(hcl(0, 80, seq(50, 80, 10))) # numeric vectors are greyscale ... as.raster(1:5, max = 5) # logical vectors are black and white ... as.raster(1:10 %% 2 == 0) # ... unless nrow/ncol are supplied ... as.raster(1:10 %% 2 == 0, nrow = 1) # Matrix can also be logical or numeric (or raw) ... as.raster(matrix(c(TRUE, FALSE), nrow = 3, ncol = 2)) as.raster(matrix(1:3/4, nrow = 3, ncol = 4)) # An array can be 3-plane numeric (R, G, B planes) ... as.raster(array(c(0:1, rep(0.5, 4)), c(2, 1, 3))) # ... or 4-plane numeric (R, G, B, A planes) as.raster(array(c(0:1, rep(0.5, 6)), c(2, 1, 4))) # subsetting r <- as.raster(matrix(colors()[1:100], ncol = 10)) r[, 2] r[2:4, 2:5] # assigning to subset r[2:4, 2:5] <- "white" # comparison r == "white"
# A red gradient as.raster(matrix(hcl(0, 80, seq(50, 80, 10)), nrow = 4, ncol = 5)) # Vectors are 1-column matrices ... # character vectors are color names ... as.raster(hcl(0, 80, seq(50, 80, 10))) # numeric vectors are greyscale ... as.raster(1:5, max = 5) # logical vectors are black and white ... as.raster(1:10 %% 2 == 0) # ... unless nrow/ncol are supplied ... as.raster(1:10 %% 2 == 0, nrow = 1) # Matrix can also be logical or numeric (or raw) ... as.raster(matrix(c(TRUE, FALSE), nrow = 3, ncol = 2)) as.raster(matrix(1:3/4, nrow = 3, ncol = 4)) # An array can be 3-plane numeric (R, G, B planes) ... as.raster(array(c(0:1, rep(0.5, 4)), c(2, 1, 3))) # ... or 4-plane numeric (R, G, B, A planes) as.raster(array(c(0:1, rep(0.5, 6)), c(2, 1, 4))) # subsetting r <- as.raster(matrix(colors()[1:100], ncol = 10)) r[, 2] r[2:4, 2:5] # assigning to subset r[2:4, 2:5] <- "white" # comparison r == "white"
Compute pretty axis scales and tick mark locations, the same way as traditional R graphics do it. This is interesting particularly for log scale axes.
axisTicks(usr, log, axp = NULL, nint = 5) .axisPars(usr, log = FALSE, nintLog = 5)
axisTicks(usr, log, axp = NULL, nint = 5) .axisPars(usr, log = FALSE, nintLog = 5)
usr |
numeric vector of length 2, with |
log |
logical indicating if a log scale is (thought to be) in use. |
axp |
numeric vector of length 3, |
nint , nintLog
|
positive integer value indicating
(approximately) the desired number of intervals.
|
axisTicks(usr, *)
calls .axisPars(usr, ..)
to set
axp
when that is missing or NULL
.
Apart from that, axisTicks()
just calls the C function
CreateAtVector()
in ‘R/src/main/plot.c’ which is also
called by the base graphics package function
axis(side, *)
when its argument at
is not
specified.
Since R 4.1.0, the underlying C CreateAtVector()
has been tuned
to provide a considerably more balanced (symmetric) set of tick locations.
axisTicks()
returns a numeric vector of potential axis tick
locations, of length approximately nint+1
.
.axisPars()
returns a list
with components
axp |
numeric vector of length 2, |
n |
integer (code), with the same meaning as
|
axTicks
,
axis
, and par
all from
the graphics package.
##--- Demonstrating correspondence between graphics' ##--- axis() and the graphics-engine agnostic axisTicks() : require("graphics") plot(10*(0:10)); (pu <- par("usr")) aX <- function(side, at, ...) axis(side, at = at, labels = FALSE, lwd.ticks = 2, col.ticks = 2, tck = 0.05, ...) aX(1, print(xa <- axisTicks(pu[1:2], log = FALSE))) # x axis aX(2, print(ya <- axisTicks(pu[3:4], log = FALSE))) # y axis axisTicks(pu[3:4], log = FALSE, nint = 10) plot(10*(0:10), log = "y"); (pu <- par("usr")) aX(2, print(ya <- axisTicks(pu[3:4], log = TRUE))) # y axis plot(2^(0:9), log = "y"); (pu <- par("usr")) aX(2, print(ya <- axisTicks(pu[3:4], log = TRUE))) # y axis
##--- Demonstrating correspondence between graphics' ##--- axis() and the graphics-engine agnostic axisTicks() : require("graphics") plot(10*(0:10)); (pu <- par("usr")) aX <- function(side, at, ...) axis(side, at = at, labels = FALSE, lwd.ticks = 2, col.ticks = 2, tck = 0.05, ...) aX(1, print(xa <- axisTicks(pu[1:2], log = FALSE))) # x axis aX(2, print(ya <- axisTicks(pu[3:4], log = FALSE))) # y axis axisTicks(pu[3:4], log = FALSE, nint = 10) plot(10*(0:10), log = "y"); (pu <- par("usr")) aX(2, print(ya <- axisTicks(pu[3:4], log = TRUE))) # y axis plot(2^(0:9), log = "y"); (pu <- par("usr")) aX(2, print(ya <- axisTicks(pu[3:4], log = TRUE))) # y axis
This function is typically called by another function to gather the statistics necessary for producing box plots, but may be invoked separately.
boxplot.stats(x, coef = 1.5, do.conf = TRUE, do.out = TRUE)
boxplot.stats(x, coef = 1.5, do.conf = TRUE, do.out = TRUE)
x |
a numeric vector for which the boxplot will
be constructed ( |
coef |
this determines how far the plot ‘whiskers’ extend out
from the box. If |
do.conf , do.out
|
logicals; if |
The two ‘hinges’ are versions of the first and third quartile,
i.e., close to quantile(x, c(1,3)/4)
. The hinges equal
the quartiles for odd (where
n <- length(x)
) and
differ for even . Whereas the quartiles only equal observations
for
n %% 4 == 1
(),
the hinges do so additionally for
n %% 4 == 2
(), and are in the middle of
two observations otherwise.
The notches (if requested) extend to +/-1.58 IQR/sqrt(n)
.
This seems to be based on the same calculations as the formula with 1.57 in
Chambers et al. (1983, p. 62), given in
McGill et al. (1978, p. 16).
They are based on asymptotic normality of the median
and roughly equal sample sizes for the two medians being compared, and
are said to be rather insensitive to the underlying distributions of
the samples. The idea appears to be to give roughly a 95% confidence
interval for the difference in two medians.
A list with named components as follows:
stats |
a vector of length 5, containing the extreme of the
lower whisker, the lower ‘hinge’, the median, the upper
‘hinge’ and the extreme of the upper whisker.
For |
n |
the number of non- |
conf |
the lower and upper extremes of the ‘notch’
( |
out |
the values of any data points which lie beyond the
extremes of the whiskers ( |
Note that stats
and conf
are sorted in increasing
order, unlike S, and that n
and out
include any
+- Inf
values.
Tukey, J. W. (1977). Exploratory Data Analysis. Section 2C.
McGill, R., Tukey, J. W. and Larsen, W. A. (1978). Variations of box plots. The American Statistician, 32, 12–16. doi:10.2307/2683468.
Velleman, P. F. and Hoaglin, D. C. (1981). Applications, Basics and Computing of Exploratory Data Analysis. Duxbury Press.
Emerson, J. D and Strenio, J. (1983). Boxplots and batch comparison. Chapter 3 of Understanding Robust and Exploratory Data Analysis, eds. D. C. Hoaglin, F. Mosteller and J. W. Tukey. Wiley.
Chambers, J. M., Cleveland, W. S., Kleiner, B. and Tukey, P. A. (1983). Graphical Methods for Data Analysis. Wadsworth & Brooks/Cole.
require(stats) x <- c(1:100, 1000) (b1 <- boxplot.stats(x)) (b2 <- boxplot.stats(x, do.conf = FALSE, do.out = FALSE)) stopifnot(b1 $ stats == b2 $ stats) # do.out = FALSE is still robust boxplot.stats(x, coef = 3, do.conf = FALSE) ## no outlier treatment: (b3 <- boxplot.stats(x, coef = 0)) stopifnot(b3$stats == fivenum(x)) ## missing values are ignored stopifnot(identical(boxplot.stats(c(x, NA)), b1)) ## ... infinite values are not: (r <- boxplot.stats(c(x, -1:1/0))) stopifnot(r$out == c(1000, -Inf, Inf))
require(stats) x <- c(1:100, 1000) (b1 <- boxplot.stats(x)) (b2 <- boxplot.stats(x, do.conf = FALSE, do.out = FALSE)) stopifnot(b1 $ stats == b2 $ stats) # do.out = FALSE is still robust boxplot.stats(x, coef = 3, do.conf = FALSE) ## no outlier treatment: (b3 <- boxplot.stats(x, coef = 0)) stopifnot(b3$stats == fivenum(x)) ## missing values are ignored stopifnot(identical(boxplot.stats(c(x, NA)), b1)) ## ... infinite values are not: (r <- boxplot.stats(c(x, -1:1/0))) stopifnot(r$out == c(1000, -Inf, Inf))
bringToTop
brings the specified screen device's window to the
front of the window stack (and gives it focus). With first argument
-1
it brings the console to the top.
If stay = TRUE
, the window is designated as a topmost window,
i.e. it will stay on top of any regular window. stay
may only be used
when RGui is run in SDI mode. This corresponds to the “Stay on top”
popup menu item in RGui.
bringToTop(which = dev.cur(), stay = FALSE)
bringToTop(which = dev.cur(), stay = FALSE)
which |
a device number, or |
stay |
whether to make the window stay on top. |
Graphics devices for SVG, PDF and PostScript graphics files using the cairo graphics API.
svg(filename = if(onefile) "Rplots.svg" else "Rplot%03d.svg", width = 7, height = 7, pointsize = 12, onefile = FALSE, family = "sans", bg = "white", antialias = c("default", "none", "gray", "subpixel"), symbolfamily) cairo_pdf(filename = if(onefile) "Rplots.pdf" else "Rplot%03d.pdf", width = 7, height = 7, pointsize = 12, onefile = TRUE, family = "sans", bg = "white", antialias = c("default", "none", "gray", "subpixel"), fallback_resolution = 300, symbolfamily) cairo_ps(filename = if(onefile) "Rplots.ps" else "Rplot%03d.ps", width = 7, height = 7, pointsize = 12, onefile = TRUE, family = "sans", bg = "white", antialias = c("default", "none", "gray", "subpixel"), fallback_resolution = 300, symbolfamily)
svg(filename = if(onefile) "Rplots.svg" else "Rplot%03d.svg", width = 7, height = 7, pointsize = 12, onefile = FALSE, family = "sans", bg = "white", antialias = c("default", "none", "gray", "subpixel"), symbolfamily) cairo_pdf(filename = if(onefile) "Rplots.pdf" else "Rplot%03d.pdf", width = 7, height = 7, pointsize = 12, onefile = TRUE, family = "sans", bg = "white", antialias = c("default", "none", "gray", "subpixel"), fallback_resolution = 300, symbolfamily) cairo_ps(filename = if(onefile) "Rplots.ps" else "Rplot%03d.ps", width = 7, height = 7, pointsize = 12, onefile = TRUE, family = "sans", bg = "white", antialias = c("default", "none", "gray", "subpixel"), fallback_resolution = 300, symbolfamily)
filename |
the file path of the output file(s).
The page number is substituted if a C integer format is included in
the character string, as in the default. (Depending on the platform,
the result must be less
than |
width |
the width of the device in inches. |
height |
the height of the device in inches. |
pointsize |
the default pointsize of plotted text (in big points). |
onefile |
should all plots appear in one file or in separate files? |
family |
one of the device-independent font families,
On unix-alikes (incl.\ macOS), see
the ‘Cairo fonts’ section in the help for |
bg |
the initial background colour: can be overridden by setting
|
antialias |
string, the type of anti-aliasing (if any) to be used;
defaults to |
fallback_resolution |
numeric: the resolution in dpi used when falling back to bitmap output. |
symbolfamily |
a length-one character string that specifies the font family to be used as the "symbol" font (e.g., for plotmath output). |
SVG (Scalar Vector Graphics) is a W3C standard for vector graphics.
See https://www.w3.org/Graphics/SVG/. The output from
svg
is SVG version 1.1 for onefile = FALSE
(the
default), otherwise SVG 1.2. (SVG 1.2 never passed the draft
stage. Few SVG viewers are capable of displaying multi-page SVG files,
and they have been dropped from SVG 2.0 (still in draft).)
Note that unlike pdf
and postscript
,
cairo_pdf
and cairo_ps
sometimes record bitmaps
and not vector graphics. On the other hand, they can
(on suitable platforms) include a much wider range of UTF-8 glyphs,
and embed the fonts used.
The output produced by cairo_ps(onefile = FALSE)
will be
encapsulated postscript on a platform with cairo >= 1.6.
R can be compiled without support for any of these devices: this will be reported if you attempt to use them on a system where they are not supported.
If you plot more than one page on one of these devices and do not
include something like %d
for the sequence number in
filename
(or set onefile = TRUE
) the file will contain the
last page plotted.
There is full support of semi-transparency, but using this is one of
the things liable to trigger bitmap output (and will always do so for
cairo_ps
).
A plot device is opened: nothing is returned to the R interpreter.
Anti-aliasing is applied to both graphics and fonts. It is generally
preferable for lines and text, but can lead to undesirable effects for
fills, e.g. for image
plots, and so is never used for
fills.
antialias = "default"
is in principle platform-dependent, but
seems most often equivalent to antialias = "gray"
.
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is in pixels (svg
) or inches.
Font sizes are in big points.
The default font family is Helvetica.
Line widths are multiples of 1/96 inch.
Circle radii have a minimum of 1/72 inch.
Colours are interpreted by the viewing application.
Support for all these devices are optional, so in packages they should
be used conditionally after checking capabilities("cairo")
.
In principle these devices are independent of X11 (as is seen by their presence on Windows). But on a Unix-alike the cairo libraries may be distributed as part of the X11 system and hence that (for example, on macOS, XQuartz) may need to be installed.
Devices
, dev.print
, pdf
,
postscript
capabilities
to see if cairo is supported.
Specify a symbol font for a Cairo-based graphics device. This function provides the opportunity to specify whether the font supports Private Use Area code points.
cairoSymbolFont(family, usePUA = TRUE)
cairoSymbolFont(family, usePUA = TRUE)
family |
A character vector giving the symbol font family name. |
usePUA |
Does the font support Private Use Area code points? |
On Cairo-based graphics devices, when drawing with a symbol font (e.g., plotmath), Adobe Symbol Encoding characters are converted to UTF-8 code points. This conversion can use Private Use Area code points or not. It is useful to be able to specify this option because some fonts (e.g., the OpenSymbol font that is included in LibreOffice) have glyphs mapped to the Private Use Area and some fonts (e.g., Nimbus Sans L, the URW Fonts equivalent of Helvetica) do not.
An object of class "CairoSymbolFont"
.
## Not run: ## If a font uses PUA, we can just specify the font name ... cairo_pdf(symbolfamily="OpenSymbol") dev.off() ## ... or equivalently ... cairo_pdf(symbolfamily=cairoSymbolFont("OpenSymbol")) dev.off() ## If a font does not use PUA, we must indicate that ... cairo_pdf(symbolfamily=cairoSymbolFont("Nimbus Sans", usePUA=FALSE)) dev.off() ## End(Not run)
## Not run: ## If a font uses PUA, we can just specify the font name ... cairo_pdf(symbolfamily="OpenSymbol") dev.off() ## ... or equivalently ... cairo_pdf(symbolfamily=cairoSymbolFont("OpenSymbol")) dev.off() ## If a font does not use PUA, we must indicate that ... cairo_pdf(symbolfamily=cairoSymbolFont("Nimbus Sans", usePUA=FALSE)) dev.off() ## End(Not run)
Utility function for setting options with some consistency checks.
The attributes
of the new settings in new
are
checked for consistency with the model (often default)
list in name.opt
.
check.options(new, name.opt, reset = FALSE, assign.opt = FALSE, envir = .GlobalEnv, check.attributes = c("mode", "length"), override.check = FALSE)
check.options(new, name.opt, reset = FALSE, assign.opt = FALSE, envir = .GlobalEnv, check.attributes = c("mode", "length"), override.check = FALSE)
new |
a named list |
name.opt |
character with the name of R object containing the default list. |
reset |
logical; if |
assign.opt |
logical; if |
envir |
the |
check.attributes |
character containing the attributes which
|
override.check |
logical vector of length |
A list of components with the same names as the one called
name.opt
.
The values of the components are changed from the new
list,
as long as these pass the checks (when these are not overridden
according to override.check
).
Option "names"
is exempt from all the checks or warnings, as in
the application it can be NULL
or a variable-length character
vector.
Martin Maechler
ps.options
and pdf.options
,
which use check.options
.
(L1 <- list(a = 1:3, b = pi, ch = "CH")) check.options(list(a = 0:2), name.opt = "L1") check.options(NULL, reset = TRUE, name.opt = "L1")
(L1 <- list(a = 1:3, b = pi, ch = "CH")) check.options(list(a = 0:2), name.opt = "L1") check.options(NULL, reset = TRUE, name.opt = "L1")
Computes the subset of points which lie on the convex hull of the set of points specified.
chull(x, y = NULL)
chull(x, y = NULL)
x , y
|
coordinate vectors of points. This can be specified as two
vectors |
xy.coords
is used to interpret the specification of the
points. Infinite, missing and NaN
values are not allowed.
The algorithm is that given by Eddy (1977).
An integer vector giving the indices of the unique points lying on the convex hull, in clockwise order. (The first will be returned for duplicate points.)
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988). The New S Language. Wadsworth & Brooks/Cole.
Eddy, W. F. (1977). A new convex hull algorithm for planar sets. ACM Transactions on Mathematical Software, 3, 398–403. doi:10.1145/355759.355766.
Eddy, W. F. (1977). Algorithm 523: CONVEX, A new convex hull algorithm for planar sets [Z]. ACM Transactions on Mathematical Software, 3, 411–412. doi:10.1145/355759.355768.
X <- matrix(stats::rnorm(2000), ncol = 2) chull(X) plot(X, cex = 0.5) polygon(X[chull(X), ])
X <- matrix(stats::rnorm(2000), ncol = 2) chull(X) plot(X, cex = 0.5) polygon(X[chull(X), ])
Translates from inches to cm (centimeters).
cm(x)
cm(x)
x |
numeric vector |
cm(1) # = 2.54 ## Translate *from* cm *to* inches: 10 / cm(1) # -> 10cm are 3.937 inches
cm(1) # = 2.54 ## Translate *from* cm *to* inches: 10 / cm(1) # -> 10cm are 3.937 inches
R color to RGB (red/green/blue) conversion.
col2rgb(col, alpha = FALSE)
col2rgb(col, alpha = FALSE)
col |
vector of any of the three kinds of R color specifications,
i.e., either a color name (as listed by |
alpha |
logical value indicating whether the alpha channel (opacity) values should be returned. |
NA
(as integer or character) and "NA"
mean
transparent, which can also be specified as "transparent"
.
Values of col
not of one of these types are coerced: real
vectors are coerced to integer and other types to character. (factors
are coerced to character: in all other cases the class is
ignored when doing the coercion.)
Hexadecimal string colors can be in the long hexadecimal form (e.g.,
"#rrggbb"
or "#rrggbbaa"
) or the short form (e.g, "#rgb"
or "#rgba"
). The short form is expanded to the long form by
replicating digits (not by adding zeroes), e.g., "#rgb"
becomes
"#rrggbb"
.
Zero and negative values of col
are an error.
An integer matrix with three or four (for alpha = TRUE
) rows
and number of columns the length of col
. If col
has
names these are used as the column names of the return value.
Martin Maechler and the R core team.
The newer, more flexible interface, convertColor()
.
col2rgb("peachpuff") col2rgb(c(blu = "royalblue", reddish = "tomato")) # note: colnames col2rgb(1:8) # the ones from the palette() (if the default) col2rgb(paste0("gold", 1:4)) col2rgb("#08a0ff") ## all three kinds of color specifications: col2rgb(c(red = "red", hex = "#abcdef")) col2rgb(c(palette = 1:3)) # long and short form of hexadecimal notation col2rgb(c(long = "#559955", short = "#595")) # with alpha col2rgb(c(long = "#559955BB", short = "#595B"), alpha = TRUE) ##-- NON-INTRODUCTORY examples -- grC <- col2rgb(paste0("gray", 0:100)) table(print(diff(grC["red",]))) # '2' or '3': almost equidistant ## The 'named' grays are in between {"slate gray" is not gray, strictly} col2rgb(c(g66 = "gray66", darkg = "dark gray", g67 = "gray67", g74 = "gray74", gray = "gray", g75 = "gray75", g82 = "gray82", light = "light gray", g83 = "gray83")) crgb <- col2rgb(cc <- colors()) colnames(crgb) <- cc t(crgb) # The whole table ## How many names are 'aliases' of each other? ccodes <- c(256^(2:0) %*% crgb) cl <- split(cc, ccodes) length(cl) # 502 distinct colors table(tcc <- lengths(cl)) ## All the multiply named colors: clmult <- cl[tcc >= 2] names(clmult) <- sapply(clmult, function(x) paste(crgb[,x[1]], collapse = ",")) utils::str(clmult) ## Look at the color cube: tc <- t(crgb[, !duplicated(ccodes)]) cNms <- rownames(tc) if(requireNamespace("lattice", quietly = TRUE)) lattice::cloud(blue ~ red + green, data = as.data.frame(tc), col = cNms) ## The 8 corners of the color cube: isC <- rowSums(tc == 0 | tc == 255) == 3 cNms[isC] # "white" "black" "blue" "cyan" "green" "magenta" "red" "yellow" table(is.gray <- tc[,1] == tc[,2] & tc[,2] == tc[,3]) # (397, 105) ## Not run: ## Look at the color cube dynamically: if(require("rgl")) { open3d(windowRect = c(50,50, 950, 950)) # large, so we see details plot3d (tc, col = cNms, size = 11) # --> rotate w/ mouse; enlarged corners: points3d(tc[isC,], col = cNms[isC], size=22) bg3d("darkgray") # (to "see more"); rotate around gray-axis: play3d(spin3d(axis = c(1, 1, 1), rpm = 2), duration = 30) if(FALSE) # add all names {zoom in with 2nd mouse button!} text3d(tc[!is.gray,], texts = cNms[!is.gray], col = cNms[!is.gray], adj=-1/4, cex = 1/2) if(FALSE) { ## next version of {rgl} hover3d(tc, labels = cNms) message("Move mouse over plot to identify points.") } else { ## click on blob to see colors()' name: identify3d(tc, labels=cNms) } } ## End(Not run)
col2rgb("peachpuff") col2rgb(c(blu = "royalblue", reddish = "tomato")) # note: colnames col2rgb(1:8) # the ones from the palette() (if the default) col2rgb(paste0("gold", 1:4)) col2rgb("#08a0ff") ## all three kinds of color specifications: col2rgb(c(red = "red", hex = "#abcdef")) col2rgb(c(palette = 1:3)) # long and short form of hexadecimal notation col2rgb(c(long = "#559955", short = "#595")) # with alpha col2rgb(c(long = "#559955BB", short = "#595B"), alpha = TRUE) ##-- NON-INTRODUCTORY examples -- grC <- col2rgb(paste0("gray", 0:100)) table(print(diff(grC["red",]))) # '2' or '3': almost equidistant ## The 'named' grays are in between {"slate gray" is not gray, strictly} col2rgb(c(g66 = "gray66", darkg = "dark gray", g67 = "gray67", g74 = "gray74", gray = "gray", g75 = "gray75", g82 = "gray82", light = "light gray", g83 = "gray83")) crgb <- col2rgb(cc <- colors()) colnames(crgb) <- cc t(crgb) # The whole table ## How many names are 'aliases' of each other? ccodes <- c(256^(2:0) %*% crgb) cl <- split(cc, ccodes) length(cl) # 502 distinct colors table(tcc <- lengths(cl)) ## All the multiply named colors: clmult <- cl[tcc >= 2] names(clmult) <- sapply(clmult, function(x) paste(crgb[,x[1]], collapse = ",")) utils::str(clmult) ## Look at the color cube: tc <- t(crgb[, !duplicated(ccodes)]) cNms <- rownames(tc) if(requireNamespace("lattice", quietly = TRUE)) lattice::cloud(blue ~ red + green, data = as.data.frame(tc), col = cNms) ## The 8 corners of the color cube: isC <- rowSums(tc == 0 | tc == 255) == 3 cNms[isC] # "white" "black" "blue" "cyan" "green" "magenta" "red" "yellow" table(is.gray <- tc[,1] == tc[,2] & tc[,2] == tc[,3]) # (397, 105) ## Not run: ## Look at the color cube dynamically: if(require("rgl")) { open3d(windowRect = c(50,50, 950, 950)) # large, so we see details plot3d (tc, col = cNms, size = 11) # --> rotate w/ mouse; enlarged corners: points3d(tc[isC,], col = cNms[isC], size=22) bg3d("darkgray") # (to "see more"); rotate around gray-axis: play3d(spin3d(axis = c(1, 1, 1), rpm = 2), duration = 30) if(FALSE) # add all names {zoom in with 2nd mouse button!} text3d(tc[!is.gray,], texts = cNms[!is.gray], col = cNms[!is.gray], adj=-1/4, cex = 1/2) if(FALSE) { ## next version of {rgl} hover3d(tc, labels = cNms) message("Move mouse over plot to identify points.") } else { ## click on blob to see colors()' name: identify3d(tc, labels=cNms) } } ## End(Not run)
These functions return functions that interpolate a set of given
colors to create new color palettes (like topo.colors
) and
color ramps, functions that map the interval to colors
(like
grey
).
colorRamp(colors, bias = 1, space = c("rgb", "Lab"), interpolate = c("linear", "spline"), alpha = FALSE) colorRampPalette(colors, ...)
colorRamp(colors, bias = 1, space = c("rgb", "Lab"), interpolate = c("linear", "spline"), alpha = FALSE) colorRampPalette(colors, ...)
colors |
colors to interpolate; must be a valid argument to
|
bias |
a positive number. Higher values give more widely spaced colors at the high end. |
space |
a character string; interpolation in RGB or CIE Lab color spaces. |
interpolate |
use spline or linear interpolation. |
alpha |
logical: should alpha channel (opacity) values be
returned? It is an error to give a true value if
|
... |
arguments to pass to |
The CIE Lab color space is approximately perceptually uniform, and so gives smoother and more uniform color ramps. On the other hand, palettes that vary from one hue to another via white may have a more symmetrical appearance in RGB space.
The conversion formulas in this function do not appear to be
completely accurate and the color ramp may not reach the extreme
values in Lab space. Future changes in the R color model may change
the colors produced with space = "Lab"
.
colorRamp
returns a function
with argument a
vector of values between 0 and 1 that are mapped to a numeric matrix
of RGB color values with one row per color and 3 or 4 columns.
colorRampPalette
returns a function that takes an integer
argument (the required number of colors) and returns a character
vector of colors (see rgb
) interpolating the given sequence
(similar to heat.colors
or terrain.colors
).
Good starting points for interpolation are the “sequential” and “diverging” ColorBrewer palettes in the RColorBrewer package.
splinefun
or approxfun
are used for
interpolation.
## Both return a *function* : colorRamp(c("red", "green"))( (0:4)/4 ) ## (x) , x in [0,1] colorRampPalette(c("blue", "red"))( 4 ) ## (n) ## a ramp in opacity of blue values colorRampPalette(c(rgb(0,0,1,1), rgb(0,0,1,0)), alpha = TRUE)(8) require(graphics) ## Here space="rgb" gives palettes that vary only in saturation, ## as intended. ## With space="Lab" the steps are more uniform, but the hues ## are slightly purple. filled.contour(volcano, color.palette = colorRampPalette(c("red", "white", "blue")), asp = 1) filled.contour(volcano, color.palette = colorRampPalette(c("red", "white", "blue"), space = "Lab"), asp = 1) ## Interpolating a 'sequential' ColorBrewer palette YlOrBr <- c("#FFFFD4", "#FED98E", "#FE9929", "#D95F0E", "#993404") filled.contour(volcano, color.palette = colorRampPalette(YlOrBr, space = "Lab"), asp = 1) filled.contour(volcano, color.palette = colorRampPalette(YlOrBr, space = "Lab", bias = 0.5), asp = 1) ## 'jet.colors' is "as in Matlab" ## (and hurting the eyes by over-saturation) jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000")) filled.contour(volcano, color.palette = jet.colors, asp = 1) ## space="Lab" helps when colors don't form a natural sequence m <- outer(1:20,1:20,function(x,y) sin(sqrt(x*y)/3)) rgb.palette <- colorRampPalette(c("red", "orange", "blue"), space = "rgb") Lab.palette <- colorRampPalette(c("red", "orange", "blue"), space = "Lab") filled.contour(m, col = rgb.palette(20)) filled.contour(m, col = Lab.palette(20))
## Both return a *function* : colorRamp(c("red", "green"))( (0:4)/4 ) ## (x) , x in [0,1] colorRampPalette(c("blue", "red"))( 4 ) ## (n) ## a ramp in opacity of blue values colorRampPalette(c(rgb(0,0,1,1), rgb(0,0,1,0)), alpha = TRUE)(8) require(graphics) ## Here space="rgb" gives palettes that vary only in saturation, ## as intended. ## With space="Lab" the steps are more uniform, but the hues ## are slightly purple. filled.contour(volcano, color.palette = colorRampPalette(c("red", "white", "blue")), asp = 1) filled.contour(volcano, color.palette = colorRampPalette(c("red", "white", "blue"), space = "Lab"), asp = 1) ## Interpolating a 'sequential' ColorBrewer palette YlOrBr <- c("#FFFFD4", "#FED98E", "#FE9929", "#D95F0E", "#993404") filled.contour(volcano, color.palette = colorRampPalette(YlOrBr, space = "Lab"), asp = 1) filled.contour(volcano, color.palette = colorRampPalette(YlOrBr, space = "Lab", bias = 0.5), asp = 1) ## 'jet.colors' is "as in Matlab" ## (and hurting the eyes by over-saturation) jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000")) filled.contour(volcano, color.palette = jet.colors, asp = 1) ## space="Lab" helps when colors don't form a natural sequence m <- outer(1:20,1:20,function(x,y) sin(sqrt(x*y)/3)) rgb.palette <- colorRampPalette(c("red", "orange", "blue"), space = "rgb") Lab.palette <- colorRampPalette(c("red", "orange", "blue"), space = "Lab") filled.contour(m, col = rgb.palette(20)) filled.contour(m, col = Lab.palette(20))
Returns the built-in color names which R knows about.
colors (distinct = FALSE) colours(distinct = FALSE)
colors (distinct = FALSE) colours(distinct = FALSE)
distinct |
logical indicating if the colors returned should all be
distinct; e.g., |
These color names can be used with a col=
specification in
graphics functions.
An even wider variety of colors can be created with primitives
rgb
, hsv
and hcl
, or the derived rainbow
,
heat.colors
, etc.
"transparent"
is not a color and so not listed, but it is
accepted as a color specification.
A character vector containing all the built-in color names.
palette
for setting the ‘palette’ of colors for
col=index
specifications.
rgb
, hsv
, hcl
, gray
;
rainbow
for a nice example;
and heat.colors
, topo.colors
for images.
col2rgb
for translating to RGB numbers and extended
examples.
cl <- colors() length(cl); cl[1:20] length(cl. <- colors(TRUE)) ## only 502 of the 657 named ones ## ----------- Show all named colors and more: demo("colors") ## -----------
cl <- colors() length(cl); cl[1:20] length(cl. <- colors(TRUE)) ## only 502 of the 657 named ones ## ----------- Show all named colors and more: demo("colors") ## -----------
Calculate contour lines for a given set of data.
contourLines(x = seq(0, 1, length.out = nrow(z)), y = seq(0, 1, length.out = ncol(z)), z, nlevels = 10, levels = pretty(range(z, na.rm = TRUE), nlevels))
contourLines(x = seq(0, 1, length.out = nrow(z)), y = seq(0, 1, length.out = ncol(z)), z, nlevels = 10, levels = pretty(range(z, na.rm = TRUE), nlevels))
x , y
|
locations of grid lines at which the values in |
z |
a matrix containing the values to be plotted ( |
nlevels |
number of contour levels desired iff
|
levels |
numeric vector of levels at which to draw contour lines. |
contourLines
draws nothing, but returns a set of contour lines.
There is currently no documentation about the algorithm. The source code is in ‘R_HOME/src/main/plot3d.c’.
A list
of contours, each itself a list
with elements:
level |
The contour level. |
x |
The x-coordinates of the contour. |
y |
The y-coordinates of the contour. |
options("max.contour.segments")
for the maximal
complexity of a single contour line.
contour
: Its ‘Examples’ demonstrate how
contourLines()
can be drawn and are the same (as those from
contour()
).
x <- 10*1:nrow(volcano) y <- 10*1:ncol(volcano) cl <- contourLines(x, y, volcano) ## summarize the sizes of each the contour lines : cbind(lev = vapply(cl, `[[`, .5, "level"), n = vapply(cl, function(l) length(l$x), 1)) z <- outer(-9:25, -9:25) pretty(range(z), 10) # -300 -200 ... 600 700 utils::str(c2 <- contourLines(z)) # no segments for {-300, 700}; # 2 segments for {-200, -100, 0} # 1 segment for 100:600
x <- 10*1:nrow(volcano) y <- 10*1:ncol(volcano) cl <- contourLines(x, y, volcano) ## summarize the sizes of each the contour lines : cbind(lev = vapply(cl, `[[`, .5, "level"), n = vapply(cl, function(l) length(l$x), 1)) z <- outer(-9:25, -9:25) pretty(range(z), 10) # -300 -200 ... 600 700 utils::str(c2 <- contourLines(z)) # no segments for {-300, 700}; # 2 segments for {-200, -100, 0} # 1 segment for 100:600
Convert colours between their representations in standard colour spaces.
convertColor(color, from, to, from.ref.white, to.ref.white, scale.in = 1, scale.out = 1, clip = TRUE)
convertColor(color, from, to, from.ref.white, to.ref.white, scale.in = 1, scale.out = 1, clip = TRUE)
color |
A matrix whose rows specify colors. The function will also accept a data frame, but will silently convert to a matrix internally. |
from , to
|
Input and output color spaces. See ‘Details’ below. |
from.ref.white , to.ref.white
|
Reference whites or |
scale.in , scale.out
|
Input is divided by |
clip |
If |
Color spaces are specified by objects of class colorConverter
,
created by colorConverter
or make.rgb
.
Built-in color spaces may be referenced by strings: "XYZ"
,
"sRGB"
, "Apple RGB"
, "CIE RGB"
, "Lab"
,
"Luv"
. The converters for these colour spaces are in the object
colorspaces
.
The "sRGB"
color space is that used by standard PC monitors.
"Apple RGB"
is used by Apple monitors. "Lab"
and
"Luv"
are approximately perceptually uniform
spaces standardized by the Commission Internationale d'Eclairage.
XYZ
is a 1931 CIE standard capable of representing
all visible colors (and then some), but not in a perceptually uniform
way.
The Lab
and Luv
spaces describe colors of objects, and
so require the specification of a reference ‘white light’
color. Illuminant D65
is a standard indirect daylight,
Illuminant D50
is close to direct sunlight, and Illuminant
A
is the light from a standard incandescent bulb. Other
standard CIE illuminants supported are B
, C
, E
and
D55
. RGB colour spaces are defined relative to a particular
reference white, and can be only approximately translated to other
reference whites. The von Kries chromatic adaptation algorithm is used
for this. Prior to R 3.6, color conversions involving color spaces
created with make.rgb
were carried out assuming a D65
illuminant, irrespective of the actual illuminant used in the creation of the
color space. This affected the built-in "CIE RGB"
color space.
The RGB color spaces are specific to a particular class of display.
An RGB space cannot represent all colors, and the clip
option
controls what is done to out-of-range colors.
For the named color spaces color
must be a matrix of values in
the from
color space: in particular opaque colors.
A 3-column matrix whose rows specify the colors.
For all the conversion equations http://www.brucelindbloom.com/.
For the white points https://web.archive.org/web/20190613001950/http://efg2.com/Lab/Graphics/Colors/Chromaticity.htm.
col2rgb
and colors
for ways to specify
colors in graphics.
make.rgb
for specifying other colour spaces.
## The displayable colors from four planes of Lab space ab <- expand.grid(a = (-10:15)*10, b = (-15:10)*10) require(graphics); require(stats) # for na.omit par(mfrow = c(2, 2), mar = .1+c(3, 3, 3, .5), mgp = c(2, .8, 0)) Lab <- cbind(L = 20, ab) srgb <- convertColor(Lab, from = "Lab", to = "sRGB", clip = NA) clipped <- attr(na.omit(srgb), "na.action") srgb[clipped, ] <- 0 cols <- rgb(srgb[, 1], srgb[, 2], srgb[, 3]) image((-10:15)*10, (-15:10)*10, matrix(1:(26*26), ncol = 26), col = cols, xlab = "a", ylab = "b", main = "Lab: L=20") Lab <- cbind(L = 40, ab) srgb <- convertColor(Lab, from = "Lab", to = "sRGB", clip = NA) clipped <- attr(na.omit(srgb), "na.action") srgb[clipped, ] <- 0 cols <- rgb(srgb[, 1], srgb[, 2], srgb[, 3]) image((-10:15)*10, (-15:10)*10, matrix(1:(26*26), ncol = 26), col = cols, xlab = "a", ylab = "b", main = "Lab: L=40") Lab <- cbind(L = 60, ab) srgb <- convertColor(Lab, from = "Lab", to = "sRGB", clip = NA) clipped <- attr(na.omit(srgb), "na.action") srgb[clipped, ] <- 0 cols <- rgb(srgb[, 1], srgb[, 2], srgb[, 3]) image((-10:15)*10, (-15:10)*10, matrix(1:(26*26), ncol = 26), col = cols, xlab = "a", ylab = "b", main = "Lab: L=60") Lab <- cbind(L = 80, ab) srgb <- convertColor(Lab, from = "Lab", to = "sRGB", clip = NA) clipped <- attr(na.omit(srgb), "na.action") srgb[clipped, ] <- 0 cols <- rgb(srgb[, 1], srgb[, 2], srgb[, 3]) image((-10:15)*10, (-15:10)*10, matrix(1:(26*26), ncol = 26), col = cols, xlab = "a", ylab = "b", main = "Lab: L=80") cols <- t(col2rgb(palette())); rownames(cols) <- palette(); cols zapsmall(lab <- convertColor(cols, from = "sRGB", to = "Lab", scale.in = 255)) stopifnot(all.equal(cols, # converting back.. getting the original: round(convertColor(lab, from = "Lab", to = "sRGB", scale.out = 255)), check.attributes = FALSE))
## The displayable colors from four planes of Lab space ab <- expand.grid(a = (-10:15)*10, b = (-15:10)*10) require(graphics); require(stats) # for na.omit par(mfrow = c(2, 2), mar = .1+c(3, 3, 3, .5), mgp = c(2, .8, 0)) Lab <- cbind(L = 20, ab) srgb <- convertColor(Lab, from = "Lab", to = "sRGB", clip = NA) clipped <- attr(na.omit(srgb), "na.action") srgb[clipped, ] <- 0 cols <- rgb(srgb[, 1], srgb[, 2], srgb[, 3]) image((-10:15)*10, (-15:10)*10, matrix(1:(26*26), ncol = 26), col = cols, xlab = "a", ylab = "b", main = "Lab: L=20") Lab <- cbind(L = 40, ab) srgb <- convertColor(Lab, from = "Lab", to = "sRGB", clip = NA) clipped <- attr(na.omit(srgb), "na.action") srgb[clipped, ] <- 0 cols <- rgb(srgb[, 1], srgb[, 2], srgb[, 3]) image((-10:15)*10, (-15:10)*10, matrix(1:(26*26), ncol = 26), col = cols, xlab = "a", ylab = "b", main = "Lab: L=40") Lab <- cbind(L = 60, ab) srgb <- convertColor(Lab, from = "Lab", to = "sRGB", clip = NA) clipped <- attr(na.omit(srgb), "na.action") srgb[clipped, ] <- 0 cols <- rgb(srgb[, 1], srgb[, 2], srgb[, 3]) image((-10:15)*10, (-15:10)*10, matrix(1:(26*26), ncol = 26), col = cols, xlab = "a", ylab = "b", main = "Lab: L=60") Lab <- cbind(L = 80, ab) srgb <- convertColor(Lab, from = "Lab", to = "sRGB", clip = NA) clipped <- attr(na.omit(srgb), "na.action") srgb[clipped, ] <- 0 cols <- rgb(srgb[, 1], srgb[, 2], srgb[, 3]) image((-10:15)*10, (-15:10)*10, matrix(1:(26*26), ncol = 26), col = cols, xlab = "a", ylab = "b", main = "Lab: L=80") cols <- t(col2rgb(palette())); rownames(cols) <- palette(); cols zapsmall(lab <- convertColor(cols, from = "sRGB", to = "Lab", scale.in = 255)) stopifnot(all.equal(cols, # converting back.. getting the original: round(convertColor(lab, from = "Lab", to = "sRGB", scale.out = 255)), check.attributes = FALSE))
densCols
produces a vector containing colors which encode the
local densities at each point in a scatterplot.
densCols(x, y = NULL, nbin = 128, bandwidth, colramp = colorRampPalette(blues9[-(1:3)])) blues9
densCols(x, y = NULL, nbin = 128, bandwidth, colramp = colorRampPalette(blues9[-(1:3)])) blues9
x , y
|
the |
nbin |
numeric vector of length one (for both directions) or two
(for x and y separately) specifying the number of equally spaced
grid points for the density estimation; directly used as
|
bandwidth |
numeric vector (length 1 or 2) of smoothing bandwidth(s).
If missing, a more or less useful default is used. |
colramp |
function accepting an integer |
densCols
computes and returns the set of colors that will be
used in plotting, calling bkde2D(*,
bandwidth, gridsize = nbin, ..)
from package KernSmooth.
blues9
is a set of 9 color shades of blue used as the default in
plotting.
densCols
returns a vector of length nrow(x)
that
contains colors to be used in a subsequent scatterplot. Each color
represents the local density around the corresponding point.
Florian Hahne at FHCRC, originally
bkde2D
from package KernSmooth;
further, smoothScatter()
(package graphics) which
builds on the same computations as densCols
.
x1 <- matrix(rnorm(1e3), ncol = 2) x2 <- matrix(rnorm(1e3, mean = 3, sd = 1.5), ncol = 2) x <- rbind(x1, x2) dcols <- densCols(x) graphics::plot(x, col = dcols, pch = 20, main = "n = 1000")
x1 <- matrix(rnorm(1e3), ncol = 2) x2 <- matrix(rnorm(1e3, mean = 3, sd = 1.5), ncol = 2) x <- rbind(x1, x2) dcols <- densCols(x) graphics::plot(x, col = dcols, pch = 20, main = "n = 1000")
These functions provide control over multiple graphics devices.
dev.cur() dev.list() dev.next(which = dev.cur()) dev.prev(which = dev.cur()) dev.off(which = dev.cur()) dev.set(which = dev.next()) dev.new(..., noRStudioGD = FALSE) graphics.off()
dev.cur() dev.list() dev.next(which = dev.cur()) dev.prev(which = dev.cur()) dev.off(which = dev.cur()) dev.set(which = dev.next()) dev.new(..., noRStudioGD = FALSE) graphics.off()
which |
An integer specifying a device number. |
... |
arguments to be passed to the device selected. |
noRStudioGD |
Do not use the RStudio graphics device even if
specified as the default device: it does not accept arguments such
as |
Only one device is the ‘active’ device: this is the device in
which all graphics operations occur. There is a "null device"
which is always open but is really a placeholder: any attempt to use
it will open a new device specified by
getOption("device")
.
Devices are associated with a name (e.g., "X11"
or
"postscript"
) and a number in the range 1 to 63; the
"null device"
is always device 1. Once a device has been
opened the null device is not considered as a possible active device.
There is a list of open devices, and this is considered as a circular
list not including the null device. dev.next
and
dev.prev
select the next open device in the appropriate
direction, unless no device is open.
dev.off
shuts down the specified (by default the current)
device. If the current device is shut down and any other devices are
open, the next open device is made current. It is an error to
attempt to shut down device 1. graphics.off()
shuts down all
open graphics devices. Normal termination of a session runs the
internal equivalent of graphics.off()
.
dev.set
makes the specified device the active device. If there
is no device with that number, it is equivalent to dev.next
.
If which = 1
it opens a new device and selects that.
dev.new
opens a new device. Normally R will open a new device
automatically when needed, but this enables you to open further
devices in a platform-independent way. (For which device is used see
getOption("device")
.) Note that care is needed with
file-based devices such as pdf
and
postscript
and in that case file names such as
‘Rplots.pdf’, ‘Rplots1.pdf’, ..., ‘Rplots999.pdf’ are
tried in turn. Only named arguments are passed to the device, and
then only if they match the argument list of the device. Even so,
care is needed with the interpretation of e.g. width
, and for
the standard bitmap devices units = "in", res = 72
is forced if
neither is supplied but both width
and height
are.
dev.cur
returns a length-one named integer vector giving the
number and name of the active device, or 1, the null device, if none
is active.
dev.list
returns the numbers of all open devices, except device
1, the null device. This is a numeric vector with a
names
attribute giving the device names, or NULL
is
there is no open device.
dev.next
and dev.prev
return the number and name of the
next / previous device in the list of devices. This will be the null
device if and only if there are no open devices.
dev.off
returns the number and name of the new active device
(after the specified device has been shut down).
dev.set
returns the number and name of the new active device.
dev.new
returns the return value of the device opened, usually
invisible NULL
.
Devices
, such as postscript
, etc.
layout
and its links for setting up plotting regions
on the current device.
## Not run: ## Unix-specific example x11() plot(1:10) x11() plot(rnorm(10)) dev.set(dev.prev()) abline(0, 1) # through the 1:10 points dev.set(dev.next()) abline(h = 0, col = "gray") # for the residual plot dev.set(dev.prev()) dev.off(); dev.off() #- close the two X devices ## End(Not run)
## Not run: ## Unix-specific example x11() plot(1:10) x11() plot(rnorm(10)) dev.set(dev.prev()) abline(0, 1) # through the 1:10 points dev.set(dev.next()) abline(h = 0, col = "gray") # for the residual plot dev.set(dev.prev()) dev.off(); dev.off() #- close the two X devices ## End(Not run)
Query the capabilities of the current graphics device.
dev.capabilities(what = NULL)
dev.capabilities(what = NULL)
what |
a character vector partially matching the names of the
components listed in section ‘Value’, or |
The capabilities have to be specified by the author of the graphics
device, unless they can be deduced from missing hooks. Thus they will
often by returned as NA
, and may reflect the maximal
capabilities of the underlying device where several output formats are
supported by one device.
Most recent devices support semi-transparent colours provided the graphics format does (which PostScript does not). On the other hand, relatively few graphics formats support (fully or semi-) transparent backgrounds: generally the latter is found only in PDF and PNG plots.
A named list with some or all of the following components, any of which may
take value NA
:
semiTransparency |
logical: Does the device support semi-transparent colours? |
transparentBackground |
character: Does the device support
(semi)-transparent backgrounds? Possible values are |
rasterImage |
character: To what extent does the device support
raster images as used by |
capture |
logical: Does the current device
support raster capture as used by |
locator |
logical: Does the current device
support |
events |
character: Which events can be generated on this device?
Currently this will be a subset of |
patterns |
character: Does the device support pattern fills?
One or more of
|
clippingPaths |
logical: Does the device support clipping paths? |
masks |
character: Does the device support masks?
One or more of
|
compositing |
character: Does the device support compositing
operators?
There are many possible operators and devices may support any
subset. For example the |
transformations |
logical: Does the devices support affine transformations ? |
paths |
logical: Does the device support stroking and filling paths? |
glyphs |
logical: Does the device support rendering glyphs? |
See getGraphicsEvent
for details on interactive events.
dev.capabilities()
dev.capabilities()
dev.capture
captures the current contents of a graphics device
as a raster (bitmap) image.
dev.capture(native = FALSE)
dev.capture(native = FALSE)
native |
Logical. If |
Not all devices support capture of the output as raster bitmaps. Typically, only image-based devices do and even not all of them.
NULL
if the device does not support capture, otherwise a
matrix of color names (for native = FALSE
) or a
nativeRaster
object (for native = TRUE
).
This gives a way to hold/flush output on certain on-screen devices, and is ignored by other devices.
dev.hold(level = 1L) dev.flush(level = 1L)
dev.hold(level = 1L) dev.flush(level = 1L)
level |
Integer >= 0. The amount by which to change the hold level. Negative values will be silently replaced by zero. |
Devices which implement this maintain a stack of hold levels: calling
dev.hold
increases the level and dev.flush
decreases it.
Calling dev.hold
when the hold level is zero increases the hold
level and inhibits graphics display. When calling dev.flush
clears all pending holds the screen display is refreshed and normal
operation is resumed.
This is implemented for the cairo-based X11
types
with buffering. When the hold level is positive the ‘watch’
cursor is set on the device's window.
It is available on the quartz
device on macOS.
This is implemented for the windows
device with
buffering selected (the default). When the hold level is positive the
‘busy’ cursor is set on the device's window.
The current level after the change, invisibly. This is 0
on
devices where hold levels are not supported.
Test if the current graphics device (or that which would be opened) is interactive.
dev.interactive(orNone = FALSE) deviceIsInteractive(name = NULL)
dev.interactive(orNone = FALSE) deviceIsInteractive(name = NULL)
orNone |
logical; if |
name |
one or more device names as a character vector,
or |
The X11
(Unix), windows
(Windows) and quartz
(macOS, on-screen types only) are regarded as interactive, together
with JavaGD
(from the package of the same name) and
CairoWin
and CairoX11
(from package Cairo).
Packages can add their devices to the list by calling
deviceIsInteractive
.
dev.interactive()
returns a logical, TRUE
if and only if an
interactive (screen) device is in use.
deviceIsInteractive
returns the updated list of known
interactive devices, invisibly unless name = NULL
.
Devices
for the available devices on your platform.
dev.interactive() print(deviceIsInteractive(NULL))
dev.interactive() print(deviceIsInteractive(NULL))
Find the dimensions of the device surface of the current device.
dev.size(units = c("in", "cm", "px"))
dev.size(units = c("in", "cm", "px"))
units |
the units in which to return the value – inches, cm, or pixels (device units). |
A two-element numeric vector giving width and height of the current
device; a new device is opened if there is none, similarly to
dev.new()
.
The size information in inches can be obtained by
par("din")
, but this provides a way to access it
independent of the graphics sub-system in use. Note that
par("din")
is only updated when a new plot is started, whereas
dev.size
tracks the size as an on-screen device is resized.
dev.size("cm")
dev.size("cm")
dev.copy
copies the graphics contents of the current device
to the device specified by which
or to a new device which has
been created by the function specified by device
(it is an
error to specify both which
and device
). (If recording
is off on the current device, there are no contents to copy: this will
result in no plot or an empty plot.)
The device copied to becomes the current device.
dev.print
copies the graphics contents of the current device
to a new device which has been created by the function specified by
device
and then shuts the new device.
dev.copy2eps
is similar to dev.print
but produces an
EPSF output file in portrait orientation (horizontal = FALSE
).
dev.copy2pdf
is the analogue for PDF output.
dev.control
allows the user to control the recording of
graphics operations in a device. If displaylist
is "inhibit"
("enable"
) then recording is turned off (on). It is only safe
to change this at the beginning of a plot (just before or just after a
new page). Initially recording is on for screen devices, and off for
print devices.
dev.copy(device, ..., which = dev.next()) dev.print(device = postscript, ...) dev.copy2eps(...) dev.copy2pdf(..., out.type = "pdf") dev.control(displaylist = c("inhibit", "enable"))
dev.copy(device, ..., which = dev.next()) dev.print(device = postscript, ...) dev.copy2eps(...) dev.copy2pdf(..., out.type = "pdf") dev.control(displaylist = c("inhibit", "enable"))
device |
A device function (e.g., |
... |
Arguments to the |
which |
A device number specifying the device to copy to. |
out.type |
The name of the output device: can be |
displaylist |
A character string: the only valid values are
|
Note that these functions copy the device region and not a
plot: the background colour of the device surface is part of what is
copied. Most screen devices default to a transparent background, which
is probably not what is needed when copying to a device such as
png
.
For dev.copy2eps
and dev.copy2pdf
, width
and
height
are taken from the current device unless otherwise
specified. If just one of width
and height
is
specified, the other is adjusted to preserve the aspect ratio of the
device being copied. The default file name is Rplot.eps
or
Rplot.pdf
, and can be overridden by specifying a file
argument.
Copying to devices such as pdf
and
postscript
which need font families pre-specified needs
extra care – R is unaware of which families were used in a plot and
so they will need to manually specified by the fonts
argument
passed as part of ...
. Similarly, if the device to be copied
from was opened with a family
argument, a suitable
family
argument will need to be included in ...
.
The default for dev.print
is to produce and print a postscript
copy. This will not work unless options("printcmd")
is
set suitably and you have a PostScript printing system: see
postscript
for how to set this up. Windows users may
prefer to use dev.print(win.print)
.
dev.print
is most useful for producing a postscript print
(its default) when the following applies. Unless
file
is specified, the plot will be printed. Unless
width
, height
and pointsize
are specified
the plot dimensions will be taken from the current device, shrunk
if necessary to fit on the paper. (pointsize
is rescaled if the
plot is shrunk.) If horizontal
is not specified and the plot
can be printed at full size by switching its value this is done
instead of shrinking the plot region.
If dev.print
is used with a specified device
(even
postscript
) it sets the width and height in the same way as
dev.copy2eps
. This will not be appropriate unless the device
specifies dimensions in inches, in particular not for
png
, jpeg
, tiff
and bmp
unless
units = "inches"
is specified.
dev.copy
returns the name and number of the device which has
been copied to.
dev.print
, dev.copy2eps
and dev.copy2pdf
return
the name and number of the device which has been copied from.
Most devices (including all screen devices) have a display list
which records all of the graphics operations that occur in the device.
dev.copy
copies graphics contents by copying the display list
from one device to another device. Also, automatic redrawing of
graphics contents following the resizing of a device depends on the
contents of the display list.
After the command dev.control("inhibit")
, graphics operations
are not recorded in the display list so that dev.copy
and
dev.print
will not copy anything and the contents of a device
will not be redrawn automatically if the device is resized.
The recording of graphics operations is relatively expensive in
terms of memory so the command dev.control("inhibit")
can be
useful if memory usage is an issue.
dev.cur
and other dev.xxx
functions.
## Not run: x11() # on a Unix-alike plot(rnorm(10), main = "Plot 1") dev.copy(device = x11) mtext("Copy 1", 3) dev.print(width = 6, height = 6, horizontal = FALSE) # prints it dev.off(dev.prev()) dev.off() ## End(Not run)
## Not run: x11() # on a Unix-alike plot(rnorm(10), main = "Plot 1") dev.copy(device = x11) mtext("Copy 1", 3) dev.print(width = 6, height = 6, horizontal = FALSE) # prints it dev.off(dev.prev()) dev.off() ## End(Not run)
bitmap
generates a graphics file.
dev2bitmap
copies the current graphics device to a file in a
graphics format.
bitmap(file, type = "png16m", height = 7, width = 7, res = 72, units = "in", pointsize, taa = NA, gaa = NA, ...) dev2bitmap(file, type = "png16m", height = 7, width = 7, res = 72, units = "in", pointsize, ..., method = c("postscript", "pdf"), taa = NA, gaa = NA)
bitmap(file, type = "png16m", height = 7, width = 7, res = 72, units = "in", pointsize, taa = NA, gaa = NA, ...) dev2bitmap(file, type = "png16m", height = 7, width = 7, res = 72, units = "in", pointsize, ..., method = c("postscript", "pdf"), taa = NA, gaa = NA)
file |
The output file name, with an appropriate extension. |
type |
The type of bitmap. |
width , height
|
Dimensions of the display region. |
res |
Resolution, in dots per inch. |
units |
The units in which |
pointsize |
The pointsize to be used for text: defaults to something reasonable given the width and height |
... |
Other parameters passed to |
method |
Should the plot be done by |
taa , gaa
|
Number of bits of antialiasing for text and for graphics respectively. Usually 4 (for best effect) or 2. Not supported on all types. |
dev2bitmap
works by copying the current device to a
postscript
or pdf
device, and
post-processing the output file using ghostscript
.
bitmap
works in the same way using a postscript
device
and post-processing the output as ‘printing’.
You will need ghostscript
: the full path to the executable can
be set by the environment variable R_GSCMD. If this is unset, a
GhostScript executable will be looked for by name on your path: on a
Unix alike "gs"
is used, and on Windows the setting of the
environment variable GSC is used, otherwise commands
"gswi64c.exe"
then "gswin32c.exe"
are tried.
The types available will depend on the version of ghostscript
,
but are likely to include
"jpeg"
, "jpegcmyk"
, "jpeggray"
,
"tiffcrle"
, "tiffg3"
,
"tiffg32d"
, "tiffg4"
, "tiffgray"
, "tifflzw"
,
"tiffpack"
, "tiff12nc"
, "tiff24nc"
, "tiff32nc"
"png16"
, "png16m"
, "png256"
, "png48"
,
"pngmono"
, "pnggray"
, "pngalpha"
,
"bmp16"
, "bmp16m"
"bmp256"
, "bmp32b"
,
"bmpgray"
, "bmpmono"
.
The default type, "png16m"
, supports 24-bit colour and
anti-aliasing. Type "png256"
uses a palette of 256 colours and
could give a more compact representation. Monochrome graphs can use
"pngmono"
, or "pnggray"
if anti-aliasing is desired.
Plots with a transparent background and varying degrees of
transparency should use "pngalpha"
.
Note that for a colour TIFF image you probably want "tiff24nc"
,
which is 8-bit per channel RGB (the most common TIFF format). None of
the listed TIFF types support transparency. "tiff32nc"
uses
8-bit per channel CMYK, which printers might require.
For formats which contain a single image, a file specification like
Rplots%03d.png
can be used: this is interpreted by Ghostscript.
For dev2bitmap
if just one of width
and height
is
specified, the other is chosen to preserve the aspect ratio of the
device being copied. The main reason to prefer method = "pdf"
over the default would be to allow semi-transparent colours to be used.
For graphics parameters such as "cra"
that need to work in
pixels, the default resolution of 72dpi is always used.
On Windows only,
paths for file
and R_GSCMD which contain spaces are
mapped to short names via shortPathName
.
None.
This section describes the implementation of the conventions for
graphics devices set out in the ‘R Internals’ manual. These
devices follow the underlying device, so when viewed at the stated
res
:
The default device size is 7 inches square.
Font sizes are in big points.
The default font family is (for the standard Ghostscript setup) URW Nimbus Sans.
Line widths are as a multiple of 1/96 inch, with no minimum.
Circle of any radius are allowed.
Colours are interpreted by the viewing/printing application.
On Windows,
Use of bitmap
will leave a temporary file (with file name
starting Rbit
).
Although using type = "pdfwrite"
will work for simple plots, it
is not recommended. Either use pdf
to produce PDF
directly, or call ps2pdf -dAutoRotatePages=/None
on the
output of postscript
: that command is optimized to do
the conversion to PDF in ways that these functions are not.
savePlot
, which for windows
and
X11(type = "cairo")
provides a simple way to record a PNG
record of the current plot.
postscript
, pdf
, png
,
jpeg
, tiff
and bmp
.
To display an array of data, see image
.
This function can be used to control (for the current device) whether the user is prompted before starting a new page of output.
devAskNewPage(ask = NULL)
devAskNewPage(ask = NULL)
ask |
|
If the current device is the null device, this will open a graphics device.
The default argument just returns the current setting and does not change it.
The default value when a device is opened is taken from the
setting of options("device.ask.default")
.
The precise circumstances when the user will be asked to confirm a new
page depend on the graphics subsystem. Obviously this needs to be an
interactive session. In addition ‘recording’ needs to be in
operation, so only when the display list is enabled (see
dev.control
) which it usually is only on a screen device.
The current prompt setting before any new setting is applied.
Invisibly if ask
is logical.
The following graphics devices are currently available:
windows
:On Windows only, the graphics device for Windows (on screen, to printer and to Windows metafile).
pdf
:Write PDF graphics commands to a file.
postscript
:Writes PostScript graphics commands to a file.
xfig
:Device for XFig graphics file format. (Of historical interest only, deprecated in R 4.4.0.)
bitmap
:bitmap pseudo-device via
Ghostscript
(if available).
pictex
:Writes TeX/PicTeX graphics commands to a file (of historical interest only, deprecated in R 4.4.0).
The following devices will be functional if R was compiled to use them (they exist but will return with a warning on other systems):
cairo_pdf
, cairo_ps
:PDF and PostScript devices based on cairo graphics.
svg
:SVG device based on cairo graphics
png
:PNG bitmap device
jpeg
:JPEG bitmap device
bmp
:BMP bitmap device
tiff
:TIFF bitmap device
On Unix-alikes (including macOS) only:
X11
:The graphics device for the X11 windowing system
quartz
:The graphics device for the macOS
native Quartz 2d graphics system. (This is only functional on
macOS where it can be used from the R.app
GUI and from the
command line: but it will display on the local screen even for a
remote session.)
If no device is open, calling any high-level graphics function will cause
a device to be opened. Which device is determined by
options("device")
which is initially set as the most
appropriate for each platform: a screen device for most interactive use and
pdf
(or the setting of R_DEFAULT_DEVICE)
otherwise. The exception is interactive use under Unix if no screen
device is known to be available, when pdf()
is used.
It is possible for an R package (or an R front-end such as RStudio) to provide further graphics devices and several packages on CRAN do so. These include devices outputting SVG (svglite and PGF/TiKZ (tikzDevice, TeX-based graphics, see https://pgf.sourceforge.net/).
The individual help files for further information on any of the devices listed here;
X11.options
, quartz.options
,
ps.options
and pdf.options
for how to
customize devices.
dev.interactive
,
dev.cur
, dev.print
,
graphics.off
, image
,
dev2bitmap
.
On Unix-alikes only:capabilities
to see if X11
,
jpeg
, png
, tiff
,
quartz
and the cairo-based devices are available.
## Not run: ## open the default screen device on this platform if no device is ## open if(dev.cur() == 1) dev.new() ## End(Not run)
## Not run: ## open the default screen device on this platform if no device is ## open if(dev.cur() == 1) dev.new() ## End(Not run)
Runs Ghostscript to process a PDF or PostScript file and embed all fonts in the file.
Use embedGlyphs()
if you have drawn typeset glyphs
(see glyphInfo
), which is only relevant for PDF files.
embedFonts(file, format, outfile = file, fontpaths = character(), options = character()) embedGlyphs(file, glyphInfo, outfile = file, options = character())
embedFonts(file, format, outfile = file, fontpaths = character(), options = character()) embedGlyphs(file, glyphInfo, outfile = file, options = character())
file |
a character string giving the name of the original file. |
format |
the format for the new file (with fonts embedded) given as
the name of a Ghostscript output device.
If not specified, it is guessed from the suffix of |
outfile |
the name of the new file (with fonts embedded). |
fontpaths |
a character vector giving directories that Ghostscript will search for fonts. |
options |
a character vector containing further options to Ghostscript. |
glyphInfo |
typeset glyph information produced by
|
This function is not necessary if you just use the standard default fonts for PostScript and PDF output.
If you use a special font, this function is useful for embedding that font in your PostScript or PDF document so that it can be shared with others without them having to install your special font (provided the font licence allows this).
If the special font is not installed for Ghostscript,
you will need to tell Ghostscript where the font is, using
something like options="-sFONTPATH=path/to/font"
.
You will need ghostscript
: the full path to the executable can
be set by the environment variable R_GSCMD. If this is
unset, a GhostScript executable will be looked for by name on your
path: on a Unix alike "gs"
is used, and on Windows the setting
of the environment variable GSC is used, otherwise commands
"gswi64c.exe"
then "gswin32c.exe"
are tried.
The format
is by default "ps2write"
, when the original
file has a .ps
or .eps
suffix, or "pdfwrite"
when
the original file has a .pdf
suffix. For versions of
Ghostscript before 9.10, format = "pswrite"
or format =
"epswrite"
can be used: as from 9.14 format = "eps2write"
is
also available. If an invalid device is given, the error message will
list the available devices.
Note that Ghostscript may do font substitution, so the font embedded may differ from that specified in the original file.
Some other options which can be useful (see your Ghostscript documentation) are -dMaxSubsetPct=100, -dSubsetFonts=true and -dEmbedAllFonts=true.
embedGlyphs()
is recommended for pdf()
files
that contain typeset glyphs (see glyphInfo
),
but it will only work for TrueType fonts.
The shell command used to invoke Ghostscript is returned invisibly. This may be useful for debugging purposes as you can run the command by hand in a shell to look for problems.
Paul Murrell and Brian Ripley (2006). “Non-standard fonts in PostScript and PDF graphics.” R News, 6(2), 41–47. https://www.r-project.org/doc/Rnews/Rnews_2006-2.pdf.
Extends a numerical range by a small percentage, i.e., fraction, on both sides.
extendrange(x, r = range(x, na.rm = TRUE), f = 0.05)
extendrange(x, r = range(x, na.rm = TRUE), f = 0.05)
x |
numeric vector; not used if |
r |
numeric vector of length 2; defaults to the
|
f |
positive number(s) specifying the fraction by which the range should be
extended. If longer than one, |
A numeric vector of length 2, r + c(-f1,f2) * diff(r)
, where
f1 is f[1]
and f2 is f[2]
or f
if it is of length
one.
range
; pretty
which can be
considered a sophisticated extension of extendrange
.
x <- 1:5 (r <- range(x)) # 1 5 extendrange(x) # 0.8 5.2 extendrange(x, f= 0.01) # 0.96 5.04 ## extend more to the right: extendrange(x, f=c(.01,.03)) # 0.96 5.12 ## Use 'r' if you have it already: stopifnot(identical(extendrange(r = r), extendrange(x)))
x <- 1:5 (r <- range(x)) # 1 5 extendrange(x) # 0.8 5.2 extendrange(x, f= 0.01) # 0.96 5.04 ## extend more to the right: extendrange(x, f=c(.01,.03)) # 0.96 5.12 ## Use 'r' if you have it already: stopifnot(identical(extendrange(r = r), extendrange(x)))
This function waits for input from a graphics window in the form of a mouse or keyboard event.
getGraphicsEvent(prompt = "Waiting for input", onMouseDown = NULL, onMouseMove = NULL, onMouseUp = NULL, onKeybd = NULL, onIdle = NULL, consolePrompt = prompt) setGraphicsEventHandlers(which = dev.cur(), ...) getGraphicsEventEnv(which = dev.cur()) setGraphicsEventEnv(which = dev.cur(), env)
getGraphicsEvent(prompt = "Waiting for input", onMouseDown = NULL, onMouseMove = NULL, onMouseUp = NULL, onKeybd = NULL, onIdle = NULL, consolePrompt = prompt) setGraphicsEventHandlers(which = dev.cur(), ...) getGraphicsEventEnv(which = dev.cur()) setGraphicsEventEnv(which = dev.cur(), env)
prompt |
prompt to be displayed to the user in the graphics window |
onMouseDown |
a function to respond to mouse clicks |
onMouseMove |
a function to respond to mouse movement |
onMouseUp |
a function to respond to mouse button releases |
onKeybd |
a function to respond to key presses |
onIdle |
a function to call when no events are pending |
consolePrompt |
prompt to be displayed to the user in the console |
which |
which graphics device does the call apply to? |
... |
items including handlers to be placed in the event environment |
env |
an environment to be used as the event environment |
These functions allow user input from some graphics devices (currently
only the windows()
, X11(type = "Xlib")
and X11(type = "cairo")
screen displays
in base R). Event handlers may be installed to respond to events
involving the mouse or keyboard.
The functions are related as follows. If any of the first six
arguments to getGraphicsEvent
are given, then it uses those
in a call to setGraphicsEventHandlers
to replace any existing
handlers in the current device. This is for compatibility with pre-2.12.0 R
versions. The current normal way to set up event handlers is to
set them using setGraphicsEventHandlers
or setGraphicsEventEnv
on
one or more graphics devices, and then use getGraphicsEvent()
with
no arguments to retrieve event data.
getGraphicsEventEnv()
may be used to save the event environment
for use later.
The names of the arguments in getGraphicsEvent
are special. When
handling events, the graphics system will look through the event
environment for functions named onMouseDown
, onMouseMove
,
onMouseUp
, onKeybd
, and onIdle
, and use them as
event handlers. It will use
prompt
for a label on the graphics device. Two other special names are
which
, which will identify the graphics device, and
result
, where the result of the last event
handler will be stored before being returned by getGraphicsEvent()
.
The mouse event handlers should be functions with header
function(buttons, x, y)
. The coordinates x
and y
will be passed to mouse event handlers in device independent
coordinates (i.e., the lower left corner of the window is (0,0)
,
the upper right is (1,1)
). The buttons
argument
will be a vector listing the buttons
that are pressed at the time of the event, with 0 for left, 1 for middle, and 2
for right.
The keyboard event handler should be a function with header
function(key)
. A single element character vector will be passed
to this handler, corresponding to the key press. Shift and other modifier
keys will have been processed, so shift-a
will be passed as
"A"
. The following special keys may also be passed to the handler:
Control keys, passed as "Ctrl-A"
, etc.
Navigation keys, passed as one of"Left", "Up", "Right", "Down", "PgUp", "PgDn", "End", "Home"
Edit keys, passed as one of "Ins", "Del"
Function keys, passed as one of "F1", "F2", ...
The idle event handler onIdle
should be a function with no
arguments. If the function is undefined or NULL
, then R will
typically call a system function which (efficiently) waits for the next
event to appear on a file handle. Otherwise, the idle event handler will
be called whenever the event queue of the graphics device was found to
be empty, i.e. in an infinite loop. This feature is intended to allow
animations to respond to user input, and could be CPU-intensive.
Currently, onIdle
is only implemented for X11()
devices.
Note that calling Sys.sleep()
is not recommended within an idle
handler - Sys.sleep()
removes pending graphics events in order to
allow users to move, close, or resize windows while it is executing.
Events such as mouse and keyboard events occurring during
Sys.sleep()
are lost, and currently do not trigger the event
handlers registered via getGraphicsEvent
or
setGraphicsEventHandlers
.
The event handlers are standard R functions, and will be executed as though called from the event environment.
In an interactive session, events will be processed until
one of the event handlers returns
a non-NULL
value which will be returned as the value of
getGraphicsEvent
, or
the user interrupts the function from the console.
When run interactively,
getGraphicsEvent
returns a non-NULL
value returned from one of the event handlers.
In a non-interactive session, getGraphicsEvent
will return NULL
immediately. It
will also return NULL
if the user closes the last window that has graphics handlers.
getGraphicsEventEnv
returns the current event environment for the graphics device,
or NULL
if none has been set.
setGraphicsEventEnv
and setGraphicsEventHandlers
return the previous
event environment for the graphics device.
Duncan Murdoch
# This currently only works on the Windows, X11(type = "Xlib"), and # X11(type = "cairo") screen devices... ## Not run: savepar <- par(ask = FALSE) dragplot <- function(..., xlim = NULL, ylim = NULL, xaxs = "r", yaxs = "r") { plot(..., xlim = xlim, ylim = ylim, xaxs = xaxs, yaxs = yaxs) startx <- NULL starty <- NULL prevx <- NULL prevy <- NULL usr <- NULL devset <- function() if (dev.cur() != eventEnv$which) dev.set(eventEnv$which) dragmousedown <- function(buttons, x, y) { startx <<- x starty <<- y prevx <<- 0 prevy <<- 0 devset() usr <<- par("usr") eventEnv$onMouseMove <- dragmousemove NULL } dragmousemove <- function(buttons, x, y) { devset() deltax <- diff(grconvertX(c(startx, x), "ndc", "user")) deltay <- diff(grconvertY(c(starty, y), "ndc", "user")) if (abs(deltax-prevx) + abs(deltay-prevy) > 0) { plot(..., xlim = usr[1:2]-deltax, xaxs = "i", ylim = usr[3:4]-deltay, yaxs = "i") prevx <<- deltax prevy <<- deltay } NULL } mouseup <- function(buttons, x, y) { eventEnv$onMouseMove <- NULL } keydown <- function(key) { if (key == "q") return(invisible(1)) eventEnv$onMouseMove <- NULL NULL } setGraphicsEventHandlers(prompt = "Click and drag, hit q to quit", onMouseDown = dragmousedown, onMouseUp = mouseup, onKeybd = keydown) eventEnv <- getGraphicsEventEnv() } dragplot(rnorm(1000), rnorm(1000)) getGraphicsEvent() par(savepar) ## End(Not run)
# This currently only works on the Windows, X11(type = "Xlib"), and # X11(type = "cairo") screen devices... ## Not run: savepar <- par(ask = FALSE) dragplot <- function(..., xlim = NULL, ylim = NULL, xaxs = "r", yaxs = "r") { plot(..., xlim = xlim, ylim = ylim, xaxs = xaxs, yaxs = yaxs) startx <- NULL starty <- NULL prevx <- NULL prevy <- NULL usr <- NULL devset <- function() if (dev.cur() != eventEnv$which) dev.set(eventEnv$which) dragmousedown <- function(buttons, x, y) { startx <<- x starty <<- y prevx <<- 0 prevy <<- 0 devset() usr <<- par("usr") eventEnv$onMouseMove <- dragmousemove NULL } dragmousemove <- function(buttons, x, y) { devset() deltax <- diff(grconvertX(c(startx, x), "ndc", "user")) deltay <- diff(grconvertY(c(starty, y), "ndc", "user")) if (abs(deltax-prevx) + abs(deltay-prevy) > 0) { plot(..., xlim = usr[1:2]-deltax, xaxs = "i", ylim = usr[3:4]-deltay, yaxs = "i") prevx <<- deltax prevy <<- deltay } NULL } mouseup <- function(buttons, x, y) { eventEnv$onMouseMove <- NULL } keydown <- function(key) { if (key == "q") return(invisible(1)) eventEnv$onMouseMove <- NULL NULL } setGraphicsEventHandlers(prompt = "Click and drag, hit q to quit", onMouseDown = dragmousedown, onMouseUp = mouseup, onKeybd = keydown) eventEnv <- getGraphicsEventEnv() } dragplot(rnorm(1000), rnorm(1000)) getGraphicsEvent() par(savepar) ## End(Not run)
Create an object that contains information about typeset glyphs. This includes glyph identifiers, glyph locations, font and colour information, and metric information.
glyphInfo(id, x, y, font, size, fontList, width, height, hAnchor, vAnchor, col=NA) glyphFont(file, index, family, weight, style, PSname=NA) glyphFontList(...) glyphAnchor(value, label) glyphWidth(w, label="width", left="left") glyphHeight(h, label="height", bottom="bottom") glyphWidthLeft(w, label) glyphHeightBottom(h, label) glyphJust(just, ...) ## S3 method for class 'GlyphJust' glyphJust(just, ...) ## S3 method for class 'character' glyphJust(just, ...) ## S3 method for class 'numeric' glyphJust(just, which=NULL, ...)
glyphInfo(id, x, y, font, size, fontList, width, height, hAnchor, vAnchor, col=NA) glyphFont(file, index, family, weight, style, PSname=NA) glyphFontList(...) glyphAnchor(value, label) glyphWidth(w, label="width", left="left") glyphHeight(h, label="height", bottom="bottom") glyphWidthLeft(w, label) glyphHeightBottom(h, label) glyphJust(just, ...) ## S3 method for class 'GlyphJust' glyphJust(just, ...) ## S3 method for class 'character' glyphJust(just, ...) ## S3 method for class 'numeric' glyphJust(just, which=NULL, ...)
id |
Numeric vector of glyph identifiers (index of glyph within font file). |
x , y
|
Numeric locations of glyphs in (big) points (1/72 inches). |
font |
Integer index into |
size |
Numeric size of glyphs (in points). |
fontList |
List of glyph fonts, as generated by |
width |
Overall width of glyphs. Can be a single numeric value,
but can also be the result from a call to |
height |
Overall height of glyphs. Can be a single numeric
value, but can also be the result from a call to |
hAnchor |
Horizontal anchors for justifying glyphs relative to the
( |
vAnchor |
Vertical anchors for justifying glyphs relative to the
( |
col |
An R colour value for each glyph. Can be |
file |
Character path to font file. |
index |
Numeric index of font within font file. |
family |
Character name of font family. |
weight |
Numeric weight of glyphs (400 is normal, 700 is bold). |
style |
Character style of glyphs ( |
PSname |
The PostScript name for each font. Can be |
value , w , h
|
A numeric value. |
label , left , bottom
|
A character value. |
just |
A justification value. Either a character value like
|
which |
When |
... |
Further arguments passed to other methods. |
Multiple anchors can be specified so as to allow different
character-based justifications of the glyphs relative to the
(x
, y
) location. Horizontal anchors with labels
"left"
, "centre"
, and "right"
are required.
It is possible to specify a single numeric hAnchor
, which is
treated as the "left"
anchor, or a single anchor with label
"left"
, in which case the other
required anchors will be calculated based on the required width of the
glyphs (see below).
Vertical anchors with labels "bottom"
, "centre"
, and
"top"
are required.
It is possible to specify a single numeric vAnchor
, which is
treated as the "bottom"
anchor, or a single anchor with label
"bottom"
, in which case the other
required anchors will be calculated based on the required height of the
glyphs (see below).
An example of a non-required anchor is a vertical anchor
with the label "baseline"
so that the glyphs can be placed with
their baseline at the y
location.
Multiple widths and heights can be specified so as to allow different
numeric-based justifications of the glyphs relative to the
(x
, y
) location, e.g., 0
for left-justification
and 1
for right-justification, but with any value in between
or even outside those limits also possible.
A width with label "width"
, relative to the "left"
horizontal anchor, is required, but if a single
numeric value is given, that is assumed to be the required width.
A height with label "height"
, relative to the "bottom"
vertical anchor is required, but if a single
numeric value is given, that is assumed to be the required height.
An example of a non-required width is a "tight"
width that
is relative to a "left-bearing"
horizontal anchor, so that
the glyphs can be justified relative to a bounding box around the
glyph ink, rather than a bounding box that includes left and right
bearings.
glyphWidthLeft()
and glyphWidthHeight()
provide
an API for code that needs to access the relevant anchors for
width and height metrics.
The result from glyphInfo()
is an "RGlyphInfo"
object,
essentially a data frame with each row
containing id, location, font, and colour for a glyph.
The metric information (widths and anchors) are stored as attributes
of the data frame.
glyphAnchor()
, glyphWidth()
, and glyphHeight()
return values that can be used to specify width
, height
,
hAnchor
, and vAnchor
values to glyphInfo()
.
Any glyph with NA
in any of id
, x
, y
, or
size
is silently dropped.
Create a vector of colors from a vector of gray levels.
gray(level, alpha) grey(level, alpha)
gray(level, alpha) grey(level, alpha)
level |
a vector of desired gray levels between |
alpha |
the opacity, if specified. |
The values returned by gray
can be used with a col=
specification in graphics functions or in par
.
grey
is an alias for gray
.
A vector of colors of the same length as level
.
gray(0:8 / 8)
gray(0:8 / 8)
Create a vector of n
gamma-corrected gray colors.
gray.colors(n, start = 0.3, end = 0.9, gamma = 2.2, alpha, rev = FALSE) grey.colors(n, start = 0.3, end = 0.9, gamma = 2.2, alpha, rev = FALSE)
gray.colors(n, start = 0.3, end = 0.9, gamma = 2.2, alpha, rev = FALSE) grey.colors(n, start = 0.3, end = 0.9, gamma = 2.2, alpha, rev = FALSE)
n |
the number of gray colors ( |
start |
starting gray level in the palette (should be between
|
end |
ending gray level in the palette. |
gamma |
the gamma correction. |
alpha |
the opacity, if specified. |
rev |
logical indicating whether the ordering of the colors should be reversed. |
The function gray.colors
chooses a series of n
gamma-corrected gray levels between start
and end
:
seq(start^gamma, end^gamma, length = n)^(1/gamma)
.
The returned palette contains the corresponding gray colors.
This palette is used in barplot.default
.
grey.colors
is an alias for gray.colors
.
A vector of n
gray colors.
require(graphics) pie(rep(1, 12), col = gray.colors(12)) barplot(1:12, col = gray.colors(12))
require(graphics) pie(rep(1, 12), col = gray.colors(12)) barplot(1:12, col = gray.colors(12))
Report versions of third-party graphics software available on the current platform for R's graphics.
grSoftVersion()
grSoftVersion()
A named character vector containing at least the elements
cairo |
the version of cairographics in use, or |
cairoFT |
the FreeType/FontConfig versions if cairographics is
using those libraries directly (not via pango); otherwise,
|
pango |
the version of pango in use, or |
It may also contain the versions of third-party software used by the standard (on Windows), or X11-based (on Unix-alikes) bitmap devices:
libpng |
the version of |
jpeg |
the version of the JPEG headers used for compilation,
or |
libtiff |
the version of |
It is conceivable but unlikely that the cairo-based bitmap devices
will use different versions linked via cairographics,
especially png(type = "cairo-png")
.
On macOS, if available, the Quartz-based devices will use the system versions of these libraries rather than those reported here.
Unless otherwise stated the reported version is that of the (possibly dynamically-linked) library in use at runtime.
Note that libjpeg-turbo
as used on some Linux distributions
reports its version as "6.2"
, the IJG version from which it forked.
extSoftVersion
for versions of non-graphics software.
grSoftVersion()
grSoftVersion()
Create a vector of colors from vectors specifying hue, chroma and luminance.
hcl(h = 0, c = 35, l = 85, alpha, fixup = TRUE)
hcl(h = 0, c = 35, l = 85, alpha, fixup = TRUE)
h |
The hue of the color specified as an angle in the range [0,360]. 0 yields red, 120 yields green 240 yields blue, etc. |
c |
The chroma of the color. The upper bound for chroma depends on hue and luminance. |
l |
A value in the range [0,100] giving the luminance of the colour. For a given combination of hue and chroma, only a subset of this range is possible. |
alpha |
numeric vector of values in the range |
fixup |
a logical value which indicates whether the resulting
RGB values should be corrected to ensure that a real color results.
if |
This function corresponds to polar coordinates in the CIE-LUV
color space. Steps of equal size in this space correspond to
approximately equal perceptual changes in color. Thus, hcl
can be thought of as a perceptually based version of hsv
.
The function is primarily intended as a way of computing colors for filling areas in plots where area corresponds to a numerical value (pie charts, bar charts, mosaic plots, histograms, etc). Choosing colors which have equal chroma and luminance provides a way of minimising the irradiation illusion which would otherwise produce a misleading impression of how large the areas are.
The default values of chroma and luminance make it possible to generate a full range of hues and have a relatively pleasant pastel appearance.
The RGB values produced by this function correspond to the sRGB color space used on most PC computer displays. There are other packages which provide more general color space facilities.
Semi-transparent colors (0 < alpha < 1
) are supported only on
some devices: see rgb
.
A vector of character strings which can be used as color specifications by R graphics functions.
Missing or infinite values of any of h
, c
, l
result in NA
: such values of alpha
are taken as 1
(opaque).
At present there is no guarantee that the colours rendered by R graphics devices will correspond to their sRGB description. It is planned to adopt sRGB as the standard R color description in future.
Ross Ihaka
Ihaka, R. (2003). Colour for Presentation Graphics, Proceedings of the 3rd International Workshop on Distributed Statistical Computing (DSC 2003), March 20-22, 2003, Technische Universität Wien, Vienna, Austria. https://www.R-project.org/conferences/DSC-2003/.
require(graphics) # The Foley and Van Dam PhD Data. csd <- matrix(c( 4,2,4,6, 4,3,1,4, 4,7,7,1, 0,7,3,2, 4,5,3,2, 5,4,2,2, 3,1,3,0, 4,4,6,7, 1,10,8,7, 1,5,3,2, 1,5,2,1, 4,1,4,3, 0,3,0,6, 2,1,5,5), nrow = 4) csphd <- function(colors) barplot(csd, col = colors, ylim = c(0,30), names.arg = 72:85, xlab = "Year", ylab = "Students", legend.text = c("Winter", "Spring", "Summer", "Fall"), main = "Computer Science PhD Graduates", las = 1) # The Original (Metaphorical) Colors (Ouch!) csphd(c("blue", "green", "yellow", "orange")) # A Color Tetrad (Maximal Color Differences) csphd(hcl(h = c(30, 120, 210, 300))) # Same, but lighter and less colorful # Turn off automatic correction to make sure # that we have defined real colors. csphd(hcl(h = c(30, 120, 210, 300), c = 20, l = 90, fixup = FALSE)) # Analogous Colors # Good for those with red/green color confusion csphd(hcl(h = seq(60, 240, by = 60))) # Metaphorical Colors csphd(hcl(h = seq(210, 60, length.out = 4))) # Cool Colors csphd(hcl(h = seq(120, 0, length.out = 4) + 150)) # Warm Colors csphd(hcl(h = seq(120, 0, length.out = 4) - 30)) # Single Color hist(stats::rnorm(1000), col = hcl(240)) ## Exploring the hcl() color space {in its mapping to R's sRGB colors}: demo(hclColors)
require(graphics) # The Foley and Van Dam PhD Data. csd <- matrix(c( 4,2,4,6, 4,3,1,4, 4,7,7,1, 0,7,3,2, 4,5,3,2, 5,4,2,2, 3,1,3,0, 4,4,6,7, 1,10,8,7, 1,5,3,2, 1,5,2,1, 4,1,4,3, 0,3,0,6, 2,1,5,5), nrow = 4) csphd <- function(colors) barplot(csd, col = colors, ylim = c(0,30), names.arg = 72:85, xlab = "Year", ylab = "Students", legend.text = c("Winter", "Spring", "Summer", "Fall"), main = "Computer Science PhD Graduates", las = 1) # The Original (Metaphorical) Colors (Ouch!) csphd(c("blue", "green", "yellow", "orange")) # A Color Tetrad (Maximal Color Differences) csphd(hcl(h = c(30, 120, 210, 300))) # Same, but lighter and less colorful # Turn off automatic correction to make sure # that we have defined real colors. csphd(hcl(h = c(30, 120, 210, 300), c = 20, l = 90, fixup = FALSE)) # Analogous Colors # Good for those with red/green color confusion csphd(hcl(h = seq(60, 240, by = 60))) # Metaphorical Colors csphd(hcl(h = seq(210, 60, length.out = 4))) # Cool Colors csphd(hcl(h = seq(120, 0, length.out = 4) + 150)) # Warm Colors csphd(hcl(h = seq(120, 0, length.out = 4) - 30)) # Single Color hist(stats::rnorm(1000), col = hcl(240)) ## Exploring the hcl() color space {in its mapping to R's sRGB colors}: demo(hclColors)
If the family
graphical parameter (see par
)
has been set to one of the Hershey fonts (see ‘Details’)
Hershey vector fonts are used to render text.
When using the text
and contour
functions
Hershey fonts may be selected via the vfont
argument, which is
a character vector of length 2 (see ‘Details’ for valid
values). This allows Cyrillic to be selected, which is not available
via the font families.
Hershey
Hershey
The Hershey fonts have two advantages:
vector fonts describe each character in terms of a set of points; R renders the character by joining up the points with straight lines. This intimate knowledge of the outline of each character means that R can arbitrarily transform the characters, which can mean that the vector fonts look better for rotated text.
this implementation was adapted from the GNU libplot library which provides support for non-ASCII and non-English fonts. This means that it is possible, for example, to produce weird plotting symbols and Japanese characters.
Drawback:
You cannot use mathematical expressions (plotmath
) with
Hershey fonts.
The Hershey characters are organised into a set of fonts. A
particular font is selected by specifying one of the following
font families via par(family)
and specifying the desired font
face (plain, bold, italic, bold-italic) via par(font)
.
family | faces available |
"HersheySerif" |
plain, bold, italic, bold-italic |
"HersheySans" |
plain, bold, italic, bold-italic |
"HersheyScript" |
plain, bold |
"HersheyGothicEnglish" |
plain |
"HersheyGothicGerman" |
plain |
"HersheyGothicItalian" |
plain |
"HersheySymbol" |
plain, bold, italic, bold-italic |
"HersheySansSymbol" |
plain, italic |
In the vfont
specification for the text
and
contour
functions, the Hershey font is specified by a typeface
(e.g., serif
or sans serif
) and a fontindex or
‘style’ (e.g., plain
or italic
). The first
element of vfont
specifies the typeface and the second element
specifies the fontindex. The first table produced by
demo(Hershey)
shows the character a
produced by each of
the different fonts.
The available typeface
and fontindex
values are
available as list components of the variable Hershey
.
The allowed pairs for (typeface, fontindex)
are:
serif | plain |
serif | italic |
serif | bold |
serif | bold italic |
serif | cyrillic |
serif | oblique cyrillic |
serif | EUC |
sans serif | plain |
sans serif | italic |
sans serif | bold |
sans serif | bold italic |
script | plain |
script | italic |
script | bold |
gothic englisho | plain |
gothic german | plain |
gothic italian | plain |
serif symbol | plain |
serif symbol | italic |
serif symbol | bold |
serif symbol | bold italic |
sans serif symbol | plain |
sans serif symbol | italic |
and the indices of these are available as Hershey$allowed
.
The string to be drawn can include escape sequences, which all begin with a ‘\’. When R encounters a ‘\’, rather than drawing the ‘\’, it treats the subsequent character(s) as a coded description of what to draw.
One useful escape sequence (in the current context) is of the
form: ‘\123’. The three digits following the ‘\’
specify an octal code for a character. For example, the octal
code for p
is 160 so the strings "p"
and
"\160"
are equivalent. This is useful for producing
characters when there is not an appropriate key on your keyboard.
The other useful escape sequences all begin with ‘\\’. These are described below. Remember that backslashes have to be doubled in R character strings, so they need to be entered with four backslashes.
an entire string of Greek symbols can be produced by
selecting the HersheySymbol or HersheySansSymbol family or the
Serif Symbol or Sans Serif Symbol typeface. To allow Greek
symbols to be embedded in a string which uses a non-symbol
typeface, there are a set of symbol escape sequences of the form
‘\\ab’. For example, the escape sequence ‘\\*a’
produces a Greek alpha. The second table in demo(Hershey)
shows all of the symbol escape sequences and the symbols that they
produce.
further escape sequences of the form
‘\\ab’ are provided for producing ISO Latin-1 characters.
Another option is to use the appropriate octal code. The
(non-ASCII) ISO Latin-1 characters are in the range 241...377.
For example, ‘\366’ produces the character o with an umlaut.
The third table in demo(Hershey)
shows all of the ISO
Latin-1 escape sequences.
These characters can be used directly. (Characters not in Latin-1 are replaced by a dot.)
Several characters are missing, c-cedilla has no cedilla and
‘sharp s’ (‘U+00DF’, also known as ‘esszett’)
is rendered as ss
.
a set of characters are provided which
do not fall into any standard font. These can only be accessed by
escape sequence. For example, ‘\\LI’ produces the zodiac sign for
Libra, and ‘\\JU’ produces the astronomical sign for Jupiter.
The fourth table in demo(Hershey)
shows all of the
special character escape sequences.
cyrillic characters are implemented
according to the K018-R encoding, and can be used directly in such
a locale using the Serif typeface and Cyrillic (or Oblique Cyrillic)
fontindex. Alternatively they can be specified via an octal code
in the range 300 to 337 for lower case characters or 340 to 377 for
upper case characters. The fifth table in demo(Hershey)
shows the
octal codes for the available Cyrillic characters.
Cyrillic has to be selected via a ("serif", fontindex)
pair
rather than via a font family.
83 Hiragana, 86 Katakana, and 603 Kanji characters are implemented according to the EUC-JP (Extended Unix Code) encoding. Each character is identified by a unique hexadecimal code. The Hiragana characters are in the range 0x2421 to 0x2473, Katakana are in the range 0x2521 to 0x2576, and Kanji are (scattered about) in the range 0x3021 to 0x6d55.
When using the Serif typeface and EUC fontindex, these characters can be produced by a pair of octal codes. Given the hexadecimal code (e.g., 0x2421), take the first two digits and add 0x80 and do the same to the second two digits (e.g., 0x21 and 0x24 become 0xa4 and 0xa1), then convert both to octal (e.g., 0xa4 and 0xa1 become 244 and 241). For example, the first Hiragana character is produced by ‘\244\241’.
It is also possible to use the hexadecimal code directly. This works for all non-EUC fonts by specifying an escape sequence of the form ‘\\#J1234’. For example, the first Hiragana character is produced by ‘\\#J2421’.
The Kanji characters may be specified in a third way, using the so-called "Nelson Index", by specifying an escape sequence of the form ‘\\#N1234’. For example, the (obsolete) Kanji for ‘one’ is produced by ‘\\#N0001’.
demo(Japanese)
shows the available Japanese characters.
all of the characters in the Hershey
fonts are stored in a large array. Some characters are not
accessible in any of the Hershey fonts. These characters can only
be accessed via an escape sequence of the form ‘\\#H1234’.
For example, the fleur-de-lys is produced by ‘\\#H0746’.
The sixth and seventh tables of demo(Hershey)
shows all of
the available raw glyphs.
https://www.gnu.org/software/plotutils/plotutils.html.
demo(Hershey)
, par
,
text
, contour
.
Japanese
for the Japanese characters in the Hershey fonts.
Hershey ## for tables of examples, see demo(Hershey)
Hershey ## for tables of examples, see demo(Hershey)
Create a vector of colors from vectors specifying hue, saturation and value.
hsv(h = 1, s = 1, v = 1, alpha)
hsv(h = 1, s = 1, v = 1, alpha)
h , s , v
|
numeric vectors of values in the range |
alpha |
numeric vector of values in the range |
Semi-transparent colors (0 < alpha < 1
) are supported only on
some devices: see rgb
.
This function creates a vector of colors corresponding to the
given values in HSV space. The values returned by hsv
can be
used with a col=
specification in graphics functions or in
par
.
hcl
for a perceptually based version of hsv()
,
rgb
and rgb2hsv
for RGB to HSV conversion;
rainbow
,
gray
.
require(graphics) hsv(.5,.5,.5) ## Red tones: n <- 20; y <- -sin(3*pi*((1:n)-1/2)/n) op <- par(mar = rep(1.5, 4)) plot(y, axes = FALSE, frame.plot = TRUE, xlab = "", ylab = "", pch = 21, cex = 30, bg = rainbow(n, start = .85, end = .1), main = "Red tones") par(op)
require(graphics) hsv(.5,.5,.5) ## Red tones: n <- 20; y <- -sin(3*pi*((1:n)-1/2)/n) op <- par(mar = rep(1.5, 4)) plot(y, axes = FALSE, frame.plot = TRUE, xlab = "", ylab = "", pch = 21, cex = 30, bg = rainbow(n, start = .85, end = .1), main = "Red tones") par(op)
The implementation of Hershey vector fonts provides a large number of Japanese characters (Hiragana, Katakana, and Kanji).
Without keyboard support for typing Japanese characters, the only way
to produce these characters is to use special escape sequences: see
Hershey
.
For example, the Hiragana character for the sound ‘ka’ is produced by ‘\\#J242b’ and the Katakana character for this sound is produced by ‘\\#J252b’. The Kanji ideograph for "one" is produced by ‘\\#J306c’ or ‘\\#N0001’.
The output from demo(Japanese)
shows tables of the escape
sequences for the available Japanese characters.
https://www.gnu.org/software/plotutils/plotutils.html
require(graphics) plot(1:9, type = "n", axes = FALSE, frame.plot = TRUE, ylab = "", main = "example(Japanese)", xlab = "using Hershey fonts") par(cex = 3) Vf <- c("serif", "plain") text(4, 2, "\\#J244b\\#J245b\\#J2473", vfont = Vf) text(4, 4, "\\#J2538\\#J2563\\#J2551\\#J2573", vfont = Vf) text(4, 6, "\\#J467c\\#J4b5c", vfont = Vf) text(4, 8, "Japan", vfont = Vf) par(cex = 1) text(8, 2, "Hiragana") text(8, 4, "Katakana") text(8, 6, "Kanji") text(8, 8, "English")
require(graphics) plot(1:9, type = "n", axes = FALSE, frame.plot = TRUE, ylab = "", main = "example(Japanese)", xlab = "using Hershey fonts") par(cex = 3) Vf <- c("serif", "plain") text(4, 2, "\\#J244b\\#J245b\\#J2473", vfont = Vf) text(4, 4, "\\#J2538\\#J2563\\#J2551\\#J2573", vfont = Vf) text(4, 6, "\\#J467c\\#J4b5c", vfont = Vf) text(4, 8, "Japan", vfont = Vf) par(cex = 1) text(8, 2, "Hiragana") text(8, 4, "Katakana") text(8, 6, "Kanji") text(8, 8, "English")
These functions specify colour spaces for use in
convertColor
.
make.rgb(red, green, blue, name = NULL, white = "D65", gamma = 2.2) colorConverter(toXYZ, fromXYZ, name, white = NULL, vectorized = FALSE)
make.rgb(red, green, blue, name = NULL, white = "D65", gamma = 2.2) colorConverter(toXYZ, fromXYZ, name, white = NULL, vectorized = FALSE)
red , green , blue
|
Chromaticity (xy or xyY) of RGB primaries |
name |
Name for the colour space |
white |
Character string specifying the reference white (see ‘Details’.) |
gamma |
Display gamma (nonlinearity). A positive number or the
string |
fromXYZ |
Function to convert from XYZ tristimulus coordinates to this space |
toXYZ |
Function to convert from this space to XYZ tristimulus coordinates. |
vectorized |
Whether |
An RGB colour space is defined by the chromaticities of the red, green and blue primaries. These are given as vectors of length 2 or 3 in xyY coordinates (the Y component is not used and may be omitted). The chromaticities are defined relative to a reference white, which must be one of the CIE standard illuminants: "A", "B", "C", "D50", "D55", "D60", "E" (usually "D65").
The display gamma is most commonly 2.2, though 1.8 is used for Apple RGB.
The sRGB standard specifies a more complicated function that is close
to a gamma of 2.2; gamma = "sRGB"
uses this function.
Colour spaces other than RGB can be specified directly by giving
conversions to and from XYZ tristimulus coordinates.
The functions should take two arguments. The first is a vector giving the
coordinates for one colour. The second argument is the reference
white. If a specific reference white is included in the definition of
the colour space (as for the RGB spaces) this second argument should
be ignored and may be ...
.
As of R 3.6.0 the built in color converters along with
convertColor
were vectorized to process three column
color matrices in one call, instead of row by row via apply
.
In order to maintain backwards compatibility, colorConverter
wraps
fromXYZ
and toXYZ
in a apply
loop in case they do not
also support matrix inputs. If the fromXYZ
and toXYZ
functions
you are using operate correctly on the whole color matrix at once instead of
row by row, you can set vectorized=TRUE
for a performance improvement.
An object of class colorConverter
Conversion algorithms from http://www.brucelindbloom.com.
(pal <- make.rgb(red = c(0.6400, 0.3300), green = c(0.2900, 0.6000), blue = c(0.1500, 0.0600), name = "PAL/SECAM RGB")) ## converter for sRGB in #rrggbb format hexcolor <- colorConverter(toXYZ = function(hex, ...) { rgb <- t(col2rgb(hex))/255 colorspaces$sRGB$toXYZ(rgb, ...) }, fromXYZ = function(xyz, ...) { rgb <- colorspaces$sRGB$fromXYZ(xyz, ...) rgb <- round(rgb, 5) if (min(rgb) < 0 || max(rgb) > 1) as.character(NA) else rgb(rgb[1], rgb[2], rgb[3])}, white = "D65", name = "#rrggbb") (cols <- t(col2rgb(palette()))) zapsmall(luv <- convertColor(cols, from = "sRGB", to = "Luv", scale.in = 255)) (hex <- convertColor(luv, from = "Luv", to = hexcolor, scale.out = NULL)) ## must make hex a matrix before using it (cc <- round(convertColor(as.matrix(hex), from = hexcolor, to = "sRGB", scale.in = NULL, scale.out = 255))) stopifnot(cc == cols) ## Internally vectorized version of hexcolor, notice the use ## of `vectorized = TRUE`: hexcolorv <- colorConverter(toXYZ = function(hex, ...) { rgb <- t(col2rgb(hex))/255 colorspaces$sRGB$toXYZ(rgb, ...) }, fromXYZ = function(xyz, ...) { rgb <- colorspaces$sRGB$fromXYZ(xyz, ...) rgb <- round(rgb, 5) oob <- pmin(rgb[,1],rgb[,2],rgb[,3]) < 0 | pmax(rgb[,1],rgb[,2],rgb[,3]) > 0 res <- rep(NA_character_, nrow(rgb)) res[!oob] <- rgb(rgb[!oob,,drop=FALSE])}, white = "D65", name = "#rrggbb", vectorized=TRUE) (ccv <- round(convertColor(as.matrix(hex), from = hexcolor, to = "sRGB", scale.in = NULL, scale.out = 255))) stopifnot(ccv == cols)
(pal <- make.rgb(red = c(0.6400, 0.3300), green = c(0.2900, 0.6000), blue = c(0.1500, 0.0600), name = "PAL/SECAM RGB")) ## converter for sRGB in #rrggbb format hexcolor <- colorConverter(toXYZ = function(hex, ...) { rgb <- t(col2rgb(hex))/255 colorspaces$sRGB$toXYZ(rgb, ...) }, fromXYZ = function(xyz, ...) { rgb <- colorspaces$sRGB$fromXYZ(xyz, ...) rgb <- round(rgb, 5) if (min(rgb) < 0 || max(rgb) > 1) as.character(NA) else rgb(rgb[1], rgb[2], rgb[3])}, white = "D65", name = "#rrggbb") (cols <- t(col2rgb(palette()))) zapsmall(luv <- convertColor(cols, from = "sRGB", to = "Luv", scale.in = 255)) (hex <- convertColor(luv, from = "Luv", to = hexcolor, scale.out = NULL)) ## must make hex a matrix before using it (cc <- round(convertColor(as.matrix(hex), from = hexcolor, to = "sRGB", scale.in = NULL, scale.out = 255))) stopifnot(cc == cols) ## Internally vectorized version of hexcolor, notice the use ## of `vectorized = TRUE`: hexcolorv <- colorConverter(toXYZ = function(hex, ...) { rgb <- t(col2rgb(hex))/255 colorspaces$sRGB$toXYZ(rgb, ...) }, fromXYZ = function(xyz, ...) { rgb <- colorspaces$sRGB$fromXYZ(xyz, ...) rgb <- round(rgb, 5) oob <- pmin(rgb[,1],rgb[,2],rgb[,3]) < 0 | pmax(rgb[,1],rgb[,2],rgb[,3]) > 0 res <- rep(NA_character_, nrow(rgb)) res[!oob] <- rgb(rgb[!oob,,drop=FALSE])}, white = "D65", name = "#rrggbb", vectorized=TRUE) (ccv <- round(convertColor(as.matrix(hex), from = hexcolor, to = "sRGB", scale.in = NULL, scale.out = 255))) stopifnot(ccv == cols)
msgWindow
sends a message to manipulate the specified screen
device's window. With argument which = -1
it applies to the GUI
console (which only accepts the first three actions).
msgWindow(type = c("minimize", "restore", "maximize", "hide", "recordOn", "recordOff"), which = dev.cur())
msgWindow(type = c("minimize", "restore", "maximize", "hide", "recordOn", "recordOff"), which = dev.cur())
type |
action to be taken. |
which |
a device number, or |
mfrow
From Number of PlotsEasy setup for plotting multiple figures (in a rectangular layout) on
one page. This computes a sensible default for
par(mfrow)
.
n2mfrow(nr.plots, asp = 1)
n2mfrow(nr.plots, asp = 1)
nr.plots |
integer; the number of plot figures you'll want to draw. |
asp |
positive number; the target aspect ratio (columns / rows) in
the output. Was implicitly hardwired to |
A length-two integer vector (nr, nc)
giving the positive number of rows
and columns, fulfilling nr * nc >= nr.plots
, and currently, for
asp = 1
, nr >= nc >= 1
.
Conceptually, this is a quadratic integer optimization problem, with
inequality constraints ,
, and
(and possibly
nr >= asp*nc
),
and two objective functions which would have to be combined via a
tuning weight, say , to, e.g.,
.
The current algorithm is simple and not trying to solve one of these optimization problems.
Martin Maechler; suggestion of asp
by Michael Chirico.
require(graphics) n2mfrow(8) # 3 x 3 n <- 5 ; x <- seq(-2, 2, length.out = 51) ## suppose now that 'n' is not known {inside function} op <- par(mfrow = n2mfrow(n)) for (j in 1:n) plot(x, x^j, main = substitute(x^ exp, list(exp = j)), type = "l", col = "blue") sapply(1:14, n2mfrow) sapply(1:14, n2mfrow, asp=16/9)
require(graphics) n2mfrow(8) # 3 x 3 n <- 5 ; x <- seq(-2, 2, length.out = 51) ## suppose now that 'n' is not known {inside function} op <- par(mfrow = n2mfrow(n)) for (j in 1:n) plot(x, x^j, main = substitute(x^ exp, list(exp = j)), type = "l", col = "blue") sapply(1:14, n2mfrow) sapply(1:14, n2mfrow, asp=16/9)
Compute the number of classes for a histogram, notably hist()
.
nclass.Sturges(x) nclass.scott(x) nclass.FD(x, digits = 5)
nclass.Sturges(x) nclass.scott(x) nclass.FD(x, digits = 5)
x |
a data vector. |
digits |
number of significant digits to keep when rounding
|
nclass.Sturges
uses Sturges' formula, implicitly basing bin
sizes on the range of the data.
nclass.scott
uses Scott's choice for a normal distribution based on
the estimate of the standard error, unless that is zero where it
returns 1
.
nclass.FD
uses the Freedman-Diaconis choice based on the
inter-quartile range (IQR(signif(x, digits))
) unless that's
zero where it uses increasingly more extreme symmetric quantiles up to
c(1,511)/512 and if that difference is still zero, reverts to using
Scott's choice. The default of digits = 5
was chosen after a few
experiments, but may be too low for some situations, see PR#17274.
The suggested number of classes.
Venables, W. N. and Ripley, B. D. (2002) Modern Applied Statistics with S-PLUS. Springer, page 112.
Freedman, D. and Diaconis, P. (1981).
On the histogram as a density estimator: theory.
Zeitschrift für Wahrscheinlichkeitstheorie
und verwandte Gebiete, 57, 453–476.
doi:10.1007/BF01025868.
Scott, D. W. (1979). On optimal and data-based histograms. Biometrika, 66, 605–610. doi:10.2307/2335182.
Scott, D. W. (1992) Multivariate Density Estimation. Theory, Practice, and Visualization. Wiley.
Sturges, H. A. (1926). The choice of a class interval. Journal of the American Statistical Association, 21, 65–66. doi:10.1080/01621459.1926.10502161.
hist
and truehist
(package
MASS); dpih
(package
KernSmooth) for a plugin bandwidth proposed by Wand(1995).
set.seed(1) x <- stats::rnorm(1111) nclass.Sturges(x) ## Compare them: NC <- function(x) c(Sturges = nclass.Sturges(x), Scott = nclass.scott(x), FD = nclass.FD(x)) NC(x) onePt <- rep(1, 11) NC(onePt) # no longer gives NaN
set.seed(1) x <- stats::rnorm(1111) nclass.Sturges(x) ## Compare them: NC <- function(x) c(Sturges = nclass.Sturges(x), Scott = nclass.scott(x), FD = nclass.FD(x)) NC(x) onePt <- rep(1, 11) NC(onePt) # no longer gives NaN
View or manipulate the color palette which is used when col=
has a numeric index and supporting functions.
palette(value) palette.pals() palette.colors(n = NULL, palette = "Okabe-Ito", alpha, recycle = FALSE, names = FALSE)
palette(value) palette.pals() palette.colors(n = NULL, palette = "Okabe-Ito", alpha, recycle = FALSE, names = FALSE)
value |
an optional character vector specifying a new palette (see Details). |
n |
the number of colors to select from a palette. The default
|
palette |
a valid palette name (one of |
alpha |
an alpha-transparency level in the range [0,1] (0 means transparent and 1 means opaque). |
recycle |
logical indicating what happens in case |
names |
logical indicating whether a named vector of colors should be returned or not (provided that the palette has any names for its colors). |
The palette()
function gets or sets the current palette,
the palette.pals()
function lists the available predefined
palettes, and the palette.colors()
function
selects colors from the predefined palettes.
The color palette and referring to colors by number (see
e.g. par
) was provided for compatibility with S.
R extends and improves on the available set of palettes.
If value
has length 1, it is taken to be the name of a built-in
color palette. The available palette names are returned by
palette.pals()
. It is also possible to specify "default"
.
If value
has length greater than 1 it is assumed to contain a
description of the colors which are to make up the new palette.
The maximum size for a palette is 1024
entries.
If value
is omitted, no change is made to the current palette.
There is only one palette setting for all devices in an R session. If the palette is changed, the new palette applies to all subsequent plotting.
The current palette also applies to re-plotting (for example if an
on-screen device is resized or dev.copy
or
replayPlot
is used). The palette is recorded on the
display list at the start of each page and when it is changed.
palette()
returns a character vector giving the colors from the
palette which was in effect.
This is invisible
unless the argument is omitted.
palette.pals()
returns a character vector giving the names
of predefined palettes.
palette.colors()
returns a vector of R colors. By default (if
names = FALSE
the vector has no names. If names = TRUE
,
the function attempts to return a named vector if possible, i.e.,
for those palettes that provide names for their colors (e.g.,
"Okabe-Ito"
, "Tableau 10"
, or "Alphabet"
).
colors
for the vector of built-in named colors;
hsv
, gray
,
hcl.colors
, ... to construct colors.
adjustcolor
, e.g., for tweaking existing palettes;
colorRamp
to interpolate colors, making custom palettes;
col2rgb
for translating colors to RGB 3-vectors.
require(graphics) palette() # obtain the current palette palette("R3");palette() # old default palette palette("ggplot2") # ggplot2-style palette palette() palette(hcl.colors(8, "viridis")) (palette(gray(seq(0,.9,length.out = 25)))) # gray scales; print old palette matplot(outer(1:100, 1:30), type = "l", lty = 1,lwd = 2, col = 1:30, main = "Gray Scales Palette", sub = "palette(gray(seq(0, .9, len=25)))") palette("default") # reset back to the default ## on a device where alpha transparency is supported, ## use 'alpha = 0.3' transparency with the default palette : mycols <- adjustcolor(palette(), alpha.f = 0.3) opal <- palette(mycols) x <- rnorm(1000); xy <- cbind(x, 3*x + rnorm(1000)) plot (xy, lwd = 2, main = "Alpha-Transparency Palette\n alpha = 0.3") xy[,1] <- -xy[,1] points(xy, col = 8, pch = 16, cex = 1.5) palette("default") ## List available built-in palettes palette.pals() ## Demonstrate the colors 1:8 in different palettes using a custom matplot() sinplot <- function(main=NULL, n = 8) { x <- outer( seq(-pi, pi, length.out = 50), seq( 0, pi, length.out = n), function(x, y) sin(x - y) ) matplot(x, type = "l", lwd = 4, lty = 1, col = 1:n, ylab = "", main=main) } sinplot("default palette") palette("R3"); sinplot("R3") palette("Okabe-Ito"); sinplot("Okabe-Ito") palette("Tableau") ; sinplot("Tableau", n = 10) palROB <- colorRampPalette(c("red", "darkorange2", "blue"), space = "Lab") palette(palROB(16)); sinplot("palROB(16)", n = 16) palette("default") # reset ## color swatches for palette.colors() palette.swatch <- function(palette = palette.pals(), n = 8, nrow = 8, border = "black", cex = 1, ...) { cols <- sapply(palette, palette.colors, n = n, recycle = TRUE) ncol <- ncol(cols) nswatch <- min(ncol, nrow) op <- par(mar = rep(0.1, 4), mfrow = c(1, min(5, ceiling(ncol/nrow))), cex = cex, ...) on.exit(par(op)) while (length(palette)) { subset <- seq_len(min(nrow, ncol(cols))) plot.new() plot.window(c(0, n), c(0.25, nrow + 0.25)) y <- rev(subset) text(0, y + 0.1, palette[subset], adj = c(0, 0)) y <- rep(y, each = n) rect(rep(0:(n-1), n), y, rep(1:n, n), y - 0.5, col = cols[, subset], border = border) palette <- palette[-subset] cols <- cols [, -subset, drop = FALSE] } } palette.swatch() palette.swatch(n = 26) # show full "Alphabet"; recycle most others
require(graphics) palette() # obtain the current palette palette("R3");palette() # old default palette palette("ggplot2") # ggplot2-style palette palette() palette(hcl.colors(8, "viridis")) (palette(gray(seq(0,.9,length.out = 25)))) # gray scales; print old palette matplot(outer(1:100, 1:30), type = "l", lty = 1,lwd = 2, col = 1:30, main = "Gray Scales Palette", sub = "palette(gray(seq(0, .9, len=25)))") palette("default") # reset back to the default ## on a device where alpha transparency is supported, ## use 'alpha = 0.3' transparency with the default palette : mycols <- adjustcolor(palette(), alpha.f = 0.3) opal <- palette(mycols) x <- rnorm(1000); xy <- cbind(x, 3*x + rnorm(1000)) plot (xy, lwd = 2, main = "Alpha-Transparency Palette\n alpha = 0.3") xy[,1] <- -xy[,1] points(xy, col = 8, pch = 16, cex = 1.5) palette("default") ## List available built-in palettes palette.pals() ## Demonstrate the colors 1:8 in different palettes using a custom matplot() sinplot <- function(main=NULL, n = 8) { x <- outer( seq(-pi, pi, length.out = 50), seq( 0, pi, length.out = n), function(x, y) sin(x - y) ) matplot(x, type = "l", lwd = 4, lty = 1, col = 1:n, ylab = "", main=main) } sinplot("default palette") palette("R3"); sinplot("R3") palette("Okabe-Ito"); sinplot("Okabe-Ito") palette("Tableau") ; sinplot("Tableau", n = 10) palROB <- colorRampPalette(c("red", "darkorange2", "blue"), space = "Lab") palette(palROB(16)); sinplot("palROB(16)", n = 16) palette("default") # reset ## color swatches for palette.colors() palette.swatch <- function(palette = palette.pals(), n = 8, nrow = 8, border = "black", cex = 1, ...) { cols <- sapply(palette, palette.colors, n = n, recycle = TRUE) ncol <- ncol(cols) nswatch <- min(ncol, nrow) op <- par(mar = rep(0.1, 4), mfrow = c(1, min(5, ceiling(ncol/nrow))), cex = cex, ...) on.exit(par(op)) while (length(palette)) { subset <- seq_len(min(nrow, ncol(cols))) plot.new() plot.window(c(0, n), c(0.25, nrow + 0.25)) y <- rev(subset) text(0, y + 0.1, palette[subset], adj = c(0, 0)) y <- rep(y, each = n) rect(rep(0:(n-1), n), y, rep(1:n, n), y - 0.5, col = cols[, subset], border = border) palette <- palette[-subset] cols <- cols [, -subset, drop = FALSE] } } palette.swatch() palette.swatch(n = 26) # show full "Alphabet"; recycle most others
Create a vector of n
contiguous colors.
hcl.colors(n, palette = "viridis", alpha = NULL, rev = FALSE, fixup = TRUE) hcl.pals(type = NULL) rainbow(n, s = 1, v = 1, start = 0, end = max(1, n - 1)/n, alpha, rev = FALSE) heat.colors(n, alpha, rev = FALSE) terrain.colors(n, alpha, rev = FALSE) topo.colors(n, alpha, rev = FALSE) cm.colors(n, alpha, rev = FALSE)
hcl.colors(n, palette = "viridis", alpha = NULL, rev = FALSE, fixup = TRUE) hcl.pals(type = NULL) rainbow(n, s = 1, v = 1, start = 0, end = max(1, n - 1)/n, alpha, rev = FALSE) heat.colors(n, alpha, rev = FALSE) terrain.colors(n, alpha, rev = FALSE) topo.colors(n, alpha, rev = FALSE) cm.colors(n, alpha, rev = FALSE)
n |
the number of colors ( |
palette |
a valid palette name (one of |
alpha |
an alpha-transparency level in the range [0,1]
(0 means transparent and 1 means opaque), see argument
|
rev |
logical indicating whether the ordering of the colors should be reversed. |
fixup |
logical indicating whether the resulting color should be
corrected to RGB coordinates in [0,1], see |
type |
the type of palettes to list: |
s , v
|
the ‘saturation’ and ‘value’ to be used to complete the HSV color descriptions. |
start |
the (corrected) hue in [0,1] at which the rainbow begins. |
end |
the (corrected) hue in [0,1] at which the rainbow ends. |
All of these functions (except the helper function hcl.pals
) create a
vector of n
contiguous colors, either based on the HSV color space
(rainbow, heat, terrain, topography, and cyan-magenta colors) or the
perceptually-based HCL color space.
HSV (hue-saturation-value) is a simple transformation of the RGB
(red-green-blue) space which was therefore a convenient choice for color
palettes in many software systems (see also hsv
). However, HSV
colors capture the perceptual properties hue, colorfulness/saturation/chroma,
and lightness/brightness/luminance/value only poorly and consequently
the corresponding palettes are typically not a good choice for statistical
graphics and data visualization.
In contrast, HCL (hue-chroma-luminance) colors are much more suitable for
capturing human color perception (see also hcl
) and better color
palettes can be derived based on HCL coordinates.
Conceptually, three types of palettes are often distinguished:
Qualitative: For coding categorical information, i.e., where no particular ordering of categories is available and every color should receive the same perceptual weight.
Sequential: For coding ordered/numeric information, i.e., where colors go from high to low (or vice versa).
Diverging: Designed for coding numeric information around a central neutral value, i.e., where colors diverge from neutral to two extremes.
The hcl.colors
function provides a basic and lean implementation of
the pre-specified palettes in the colorspace package. In addition to the
types above, the functions distinguish “diverging” palettes where the two
arms are restricted to be rather balanced as opposed to flexible
“divergingx” palettes that combine two sequential palettes without any
restrictions. The latter group also includes the cividis palette as it is based
on two different hues (blue and yellow) but it is actually a sequential palette
(going from dark to light).
The names of all available HCL palettes can be queried with the hcl.pals
function and they are also visualized by color swatches in the examples. Many of
the palettes closely approximate palettes of the same name from various other
packages (including RColorBrewer, rcartocolor, viridis,
scico, among others).
The default HCL palette is the widely used viridis palette which is a sequential palette with relatively high chroma throughout so that it also works reasonably well as a qualitative palette. However, while viridis is a rather robust default palette, more suitable HCL palettes are available for most visualizations.
For example, "Dark 3"
works well for shading points or lines in
up to five groups, "YlGnBu"
is a sequential palette similar to
"viridis"
but with aligned chroma/luminance, and
"Green-Brown"
or "Blue-Red 3"
are colorblind-safe
diverging palettes.
Further qualitative palettes are provided in the
palette.colors
function. While the qualitative palettes in
hcl.colors
are always based on the same combination of chroma and
luminance, the palette.colors
vary in chroma and luminance up to
a certain degree. The advantage of fixing chroma/luminance is that the
perceptual weight of the resulting colors is more balanced. The
advantage of allowing variation is that more distinguishable colors can
be obtained, especially for viewers with color vision deficiencies.
Note that the rainbow
function implements the (in-)famous rainbow (or
jet) color palette that was used very frequently in many software packages but
has been widely criticized for its many perceptual problems.
It is specified by a start
and end
hue with red = 0,
yellow = , green =
,
cyan =
, blue =
, and
magenta =
. However, these are very flashy and unbalanced
with respect to both chroma and luminance which can lead to various optical
illusions. Also, the hues that are equispaced in RGB space tend to cluster at
the red, green, and blue primaries. Therefore, it is recommended to use a
suitable palette from
hcl.colors
instead of
rainbow
.
A character vector cv
containing either palette names (for
hcl.pals
) or n
hex color codes (for all other functions).
The latter can be used either to create a user-defined color palette for
subsequent graphics by palette(cv)
, a col =
specification
in graphics functions or in par
.
Wikipedia (2019). HCL color space – Wikipedia, The Free Encyclopedia. https://en.wikipedia.org/w/index.php?title=HCL_color_space&oldid=883465135. Accessed March 26, 2019.
Zeileis, A., Fisher, J. C., Hornik, K., Ihaka, R., McWhite, C. D., Murrell, P., Stauffer, R. and Wilke, C. O. (2020). “colorspace: A toolbox for manipulating and assessing colors and palettes.” Journal of Statistical Software, 96(1), 1–49. doi:10.18637/jss.v096.i01
Ihaka, R. (2003). “Colour for presentation graphics.” Proceedings of the 3rd International Workshop on Distributed Statistical Computing (DSC 2003), March 20-22, 2003, Technische Universität Wien, Vienna, Austria. https://www.R-project.org/conferences/DSC-2003/.
Zeileis, A., Hornik, K. and Murrell, P. (2009). Escaping RGBland: Selecting colors for statistical graphics. Computational Statistics & Data Analysis, 53, 3259–3270. doi:10.1016/j.csda.2008.11.033.
colors
, palette
,
gray.colors
,
hsv
,
hcl
, rgb
, gray
and
col2rgb
for translating to RGB numbers.
require("graphics") # color wheels in RGB/HSV and HCL space par(mfrow = c(2, 2)) pie(rep(1, 12), col = rainbow(12), main = "RGB/HSV") pie(rep(1, 12), col = hcl.colors(12, "Set 2"), main = "HCL") par(mfrow = c(1, 1)) ## color swatches for RGB/HSV palettes demo.pal <- function(n, border = if (n < 32) "light gray" else NA, main = paste("color palettes; n=", n), ch.col = c("rainbow(n, start=.7, end=.1)", "heat.colors(n)", "terrain.colors(n)", "topo.colors(n)", "cm.colors(n)")) { nt <- length(ch.col) i <- 1:n; j <- n / nt; d <- j/6; dy <- 2*d plot(i, i+d, type = "n", yaxt = "n", ylab = "", main = main) for (k in 1:nt) { rect(i-.5, (k-1)*j+ dy, i+.4, k*j, col = eval(str2lang(ch.col[k])), border = border) text(2*j, k * j + dy/4, ch.col[k]) } } demo.pal(16) ## color swatches for HCL palettes hcl.swatch <- function(type = NULL, n = 5, nrow = 11, border = if (n < 15) "black" else NA) { palette <- hcl.pals(type) cols <- sapply(palette, hcl.colors, n = n) ncol <- ncol(cols) nswatch <- min(ncol, nrow) par(mar = rep(0.1, 4), mfrow = c(1, min(5, ceiling(ncol/nrow))), pin = c(1, 0.5 * nswatch), cex = 0.7) while (length(palette)) { subset <- 1:min(nrow, ncol(cols)) plot.new() plot.window(c(0, n), c(0, nrow + 1)) text(0, rev(subset) + 0.1, palette[subset], adj = c(0, 0)) y <- rep(subset, each = n) rect(rep(0:(n-1), n), rev(y), rep(1:n, n), rev(y) - 0.5, col = cols[, subset], border = border) palette <- palette[-subset] cols <- cols[, -subset, drop = FALSE] } par(mfrow = c(1, 1), mar = c(5.1, 4.1, 4.1, 2.1), cex = 1) } hcl.swatch() hcl.swatch("qualitative") hcl.swatch("sequential") hcl.swatch("diverging") hcl.swatch("divergingx") ## heat maps with sequential HCL palette (purple) image(volcano, col = hcl.colors(11, "purples", rev = TRUE)) filled.contour(volcano, nlevels = 10, color.palette = function(n, ...) hcl.colors(n, "purples", rev = TRUE, ...)) ## list available HCL color palettes hcl.pals("qualitative") hcl.pals("sequential") hcl.pals("diverging") hcl.pals("divergingx")
require("graphics") # color wheels in RGB/HSV and HCL space par(mfrow = c(2, 2)) pie(rep(1, 12), col = rainbow(12), main = "RGB/HSV") pie(rep(1, 12), col = hcl.colors(12, "Set 2"), main = "HCL") par(mfrow = c(1, 1)) ## color swatches for RGB/HSV palettes demo.pal <- function(n, border = if (n < 32) "light gray" else NA, main = paste("color palettes; n=", n), ch.col = c("rainbow(n, start=.7, end=.1)", "heat.colors(n)", "terrain.colors(n)", "topo.colors(n)", "cm.colors(n)")) { nt <- length(ch.col) i <- 1:n; j <- n / nt; d <- j/6; dy <- 2*d plot(i, i+d, type = "n", yaxt = "n", ylab = "", main = main) for (k in 1:nt) { rect(i-.5, (k-1)*j+ dy, i+.4, k*j, col = eval(str2lang(ch.col[k])), border = border) text(2*j, k * j + dy/4, ch.col[k]) } } demo.pal(16) ## color swatches for HCL palettes hcl.swatch <- function(type = NULL, n = 5, nrow = 11, border = if (n < 15) "black" else NA) { palette <- hcl.pals(type) cols <- sapply(palette, hcl.colors, n = n) ncol <- ncol(cols) nswatch <- min(ncol, nrow) par(mar = rep(0.1, 4), mfrow = c(1, min(5, ceiling(ncol/nrow))), pin = c(1, 0.5 * nswatch), cex = 0.7) while (length(palette)) { subset <- 1:min(nrow, ncol(cols)) plot.new() plot.window(c(0, n), c(0, nrow + 1)) text(0, rev(subset) + 0.1, palette[subset], adj = c(0, 0)) y <- rep(subset, each = n) rect(rep(0:(n-1), n), rev(y), rep(1:n, n), rev(y) - 0.5, col = cols[, subset], border = border) palette <- palette[-subset] cols <- cols[, -subset, drop = FALSE] } par(mfrow = c(1, 1), mar = c(5.1, 4.1, 4.1, 2.1), cex = 1) } hcl.swatch() hcl.swatch("qualitative") hcl.swatch("sequential") hcl.swatch("diverging") hcl.swatch("divergingx") ## heat maps with sequential HCL palette (purple) image(volcano, col = hcl.colors(11, "purples", rev = TRUE)) filled.contour(volcano, nlevels = 10, color.palette = function(n, ...) hcl.colors(n, "purples", rev = TRUE, ...)) ## list available HCL color palettes hcl.pals("qualitative") hcl.pals("sequential") hcl.pals("diverging") hcl.pals("divergingx")
pdf
starts the graphics device driver for producing PDF
graphics.
pdf(file = if(onefile) "Rplots.pdf" else "Rplot%03d.pdf", width, height, onefile, family, title, fonts, version, paper, encoding, bg, fg, pointsize, pagecentre, colormodel, useDingbats, useKerning, fillOddEven, compress)
pdf(file = if(onefile) "Rplots.pdf" else "Rplot%03d.pdf", width, height, onefile, family, title, fonts, version, paper, encoding, bg, fg, pointsize, pagecentre, colormodel, useDingbats, useKerning, fillOddEven, compress)
file |
a character string giving the file path. See the section ‘File specifications’ for further details. |
width , height
|
the width and height of the graphics region in
inches. The default values are |
onefile |
logical: if true (the default) allow multiple figures
in one file. If false, generate a file with name containing the page
number for each page. Defaults to |
family |
the initial font family to be used, normally as a
character string. See the section ‘Families’. Defaults to
|
title |
title string to embed as the ‘/Title’ field in the
file. Defaults to |
fonts |
a character vector specifying R graphics font family
names for additional fonts which will be included in the PDF file.
Defaults to |
version |
a string describing the PDF version that will be
required to view the output. This is a minimum, and will be
increased (with a warning) if necessary. Defaults to |
paper |
the target paper size. The choices are
|
encoding |
the name of an encoding file. Defaults to
The file is looked for in the ‘enc’ directory of package
grDevices if the path does not contain a path separator. An
extension |
bg |
the initial background color to be used. Defaults to
|
fg |
the initial foreground color to be used. Defaults to
|
pointsize |
the default point size to be used. Strictly
speaking, in bp, that is 1/72 of an inch, but approximately in
points. Defaults to |
pagecentre |
logical: should the device region be centred on the
page? – is only relevant for |
colormodel |
a character string describing the color model:
currently allowed values are |
useDingbats |
logical. Should small circles be rendered
via the Dingbats font? Defaults to For Unix-alikes (including macOS) see the ‘Note’ for a possible fix for some viewers. |
useKerning |
logical. Should kerning corrections be included in
setting text and calculating string widths? Defaults to |
fillOddEven |
logical controlling the polygon fill mode: see
|
compress |
logical. Should PDF streams be generated with Flate
compression? Defaults to |
All arguments except file
default to values given by
pdf.options()
. The ultimate defaults are quoted in the
arguments section.
pdf()
opens the file file
and the PDF commands needed to
plot any graphics requested are sent to that file.
The family
argument can be used to specify a PDF-specific
font family as the initial/default font for the device. If additional
font families are to be used they should be included in the
fonts
argument.
If a device-independent R graphics font family is specified (e.g., via
par(family = )
in the graphics package), the PDF device makes use
of the PostScript font mappings to convert the R graphics font family
to a PDF-specific font family description. (See the
documentation for pdfFonts
.)
This device does not embed fonts in the PDF file, so it is only
straightforward to use mappings to the font families that can be
assumed to be available in any PDF viewer: "Times"
(equivalently "serif"
), "Helvetica"
(equivalently
"sans"
) and "Courier"
(equivalently "mono"
).
Other families may be specified, but it is the user's responsibility
to ensure that these fonts are available on the system and third-party
software (e.g., Ghostscript) may be required to embed the fonts so
that the PDF can be included in other documents (e.g., LaTeX): see
embedFonts
. The URW-based families described for
in section ‘Families’.can be used with viewers, platform dependently:
viewers set up to use URW fonts, which is
usual with those based on xpdf
or Ghostscript.
viewers such as GSView which utilise URW fonts.
Since embedFonts
makes use of Ghostscript, it should be
able to embed the URW-based families for use with other viewers.
The PDF produced is fairly simple, with each page being represented as a single stream (by default compressed and possibly with references to raster images). The R graphics model does not distinguish graphics objects at the level of the driver interface.
The version
argument declares the version of PDF that gets
produced. The version must be at least 1.2 when compression is used,
1.4 for semi-transparent output to be understood, and at least 1.3 if
CID fonts are to be used: if any of these features are used the
version number will be increased (with a warning). (PDF 1.4 was first
supported by Acrobat 5 in 2001; it is very unlikely not to be
supported in a current viewer.)
Line widths as controlled by par(lwd = )
are in multiples of
1/96 inch. Multiples less than 1 are allowed. pch = "."
with
cex = 1
corresponds to a square of side 1/72 inch, which is
also the ‘pixel’ size assumed for graphics parameters such as
"cra"
.
The paper
argument sets the ‘/MediaBox’ entry in the file,
which defaults to width
by height
. If it is set to
something other than "special"
, a device region of the
specified size is (by default) centred on the rectangle given by the
paper size: if either width
or height
is less
than 0.1
or too large to give a total margin of 0.5 inch, it is
reset to the corresponding paper dimension minus 0.5. Thus if you
want the default behaviour of postscript
use
pdf(paper = "a4r", width = 0, height = 0)
to centre the device region
on a landscape A4 page with 0.25 inch margins.
When the background colour is fully transparent (as is the initial default value), the PDF produced does not paint the background. Most PDF viewers will use a white canvas so the visual effect is if the background were white. This will not be the case when printing onto coloured paper, though.
Tilde expansion (see path.expand
) is done on the
file
argument. An input with a marked encoding is converted to
the native encoding or an error is given.
For use with onefile = FALSE
, give a C integer format such as
"Rplot%03d.pdf"
(the default in that case) which is expanded
using the page number, so this uses files ‘Rplot001.pdf’, ...,
‘Rplot999.pdf’, ‘Rplot1000.pdf’,
A single integer format matching the regular expression
"%[#0 +=-]*[0-9.]*[diouxX]"
is allowed in file
. The
character string should not otherwise contain a %
: if it is
really necessary, use %%
in the string for %
in the
file path.
For pdf
, file
can be NULL
when no external file
is created (effectively, no drawing occurs), but the device may still
be queried (e.g., for the size of text by (base graphics)
strwidth
or (grid)
stringWidth
).
Font families are collections of fonts covering the five font faces,
(conventionally plain, bold, italic, bold-italic and symbol) selected
by the graphics parameter par(font = )
or the grid
parameter gpar(fontface = )
. Font families can be
specified either as an initial/default font family for the device
via the family
argument or after the device is opened by
the graphics parameter par(family = )
or the grid
parameter gpar(fontfamily = )
. Families which will be
used in addition to the initial family must be specified in the
fonts
argument when the device is opened.
Font families are declared via a call to pdfFonts
or postscriptFonts
.
The argument family
specifies the initial/default font family
to be used. In normal use it is one of "AvantGarde"
,
"Bookman"
, "Courier"
, "Helvetica"
,
"Helvetica-Narrow"
, "NewCenturySchoolbook"
,
"Palatino"
or "Times"
, and refers to the standard Adobe
PostScript fonts families of those names which are included (or
cloned) in all common PDF/PostScript renderers.
Many PDF/PostScript renders (including those based on
Ghostscript) use the URW equivalents of these fonts, which are
"URWGothic"
, "URWBookman"
, "NimbusMon"
,
"NimbusSan"
, "NimbusSanCond"
, "CenturySch"
,
"URWPalladio"
and "NimbusRom"
respectively. If your
viewer is using URW fonts, you will obtain access to more characters
and more appropriate metrics by using these names. To make these
easier to remember, "URWHelvetica" == "NimbusSan"
and
"URWTimes" == "NimbusRom"
are also supported. However, if the
viewer is not using URW fonts (for example Adobe Acrobat Reader) it
may substitute inappropriately or not render at all. (Consider using
embedFonts
.)
As from R 4.4.0 there is support for URW 2.0 fonts in
families "URW2Helvetica"
(with ‘Oblique’ fonts),
"URW2HelveticaItalic"
(with ‘Italic’ fonts),
"URW2Times"
and "NimbusMonoPS"
. As recent versions of
Ghostscript will render with (and embed) these fonts. these families
should be used instead of "URWHelvetica"
, "URWTimes"
,
"NimbusSan"
, "NimbusRom"
, and "NimbusMon"
Another type of family makes use of CID-keyed fonts for East Asian
languages – see pdfFonts
.
The family
argument is normally a character string naming a
font family, but family objects generated by Type1Font
and CIDFont
are also accepted. For compatibility with
earlier versions of R, the initial family can also be specified as a
vector of four or five afm files.
Note that R does not embed the font(s) used in the PostScript output:
see embedFonts
for a utility to help do so.
Viewers and embedding applications frequently substitute fonts for
those specified in the family, and the substitute will often have
slightly different font metrics. useKerning = TRUE
spaces the
letters in the string using kerning corrections for the intended
family: this may look uglier than useKerning = FALSE
.
Encodings describe which glyphs are used to display the character codes
(in the range 0–255). Most commonly R uses ISOLatin1 encoding, and
the examples for text
are in that encoding. However,
the encoding used on machines running R may well be different, and by
using the encoding
argument the glyphs can be matched to
encoding in use. This suffices for European and Cyrillic languages,
but not for East Asian languages. For the latter, composite CID fonts are
used. These fonts are useful for other languages: for example they
may contain Greek glyphs. (The rest of this section applies only when CID
fonts are not used.)
None of this will matter if only ASCII characters (codes 32–126) are
used as all the encodings (except "TeXtext"
) agree over that
range. Some encodings are supersets of ISOLatin1. However, if
accented and special characters do not come out as you expect, you may
need to change the encoding. Some other encodings are supplied with
R: "ISOLatin2.enc"
(Central/Eastern Europe),
"ISOLatin7.enc"
(ISO 8859-13, ‘Baltic Rim’),
"ISOLatin9.enc"
(ISO 8859-15, including Euro),
"Cyrillic.enc"
(ISO 8859-5), "KOI8-R.enc"
,
"KOI8-U.enc"
, and the Windows encodings "WinAnsi.enc"
(also known as "CP1252.enc"
, "CP1250.enc"
(Central/Eastern Europe), "CP1251.enc"
(Cyrillic),
"Greek.enc"
(ISO 8859-7), "CP1253.enc"
(modern Greek)
and "CP1257.enc"
(‘Baltic Rim’). Note that many glyphs
in these encodings are not in the fonts corresponding to the standard
families. (The Adobe ones for all but Courier, Helvetica and Times
cover little more than Latin-1, whereas the URW ones also cover
Latin-2, Latin-7, Latin-9 and Cyrillic but no Greek. The Adobe
exceptions cover the Latin character sets, but not the Euro.)
NB: support for encodings other than "ISOLatin1.enc"
(and the
Windows ones on Windows) depends on support by the platform's
libiconv
in a UTF-8 locale.
If you specify the encoding, it is your responsibility to ensure that the PostScript font contains the glyphs used. One issue here is the Euro symbol which is in several encodings (including WinAnsi and ISOLatin9 encodings) but may well not be in the PostScript fonts. (It is in the URW variants; it is not in the supplied Adobe Font Metric files so will not be centred correctly.)
There is an exception. Character 45 ("-"
) is always set
as minus (its value in Adobe ISOLatin1) even though it is hyphen in
the other encodings. Hyphen is available as character 173 (octal
0255) in all the Latin encodings, Cyrillic and Greek. (This can be
entered as "\u00ad"
in a UTF-8 locale.) There are some
discrepancies in accounts of glyphs 39 and 96: the supplied encodings
(except CP1250 and CP1251) treat these as ‘quoteright’ and
‘quoteleft’ (rather than ‘quotesingle’/‘acute’
and ‘grave’ respectively), as they are in the Adobe
documentation.
The default color model ("srgb"
) is sRGB. Model "gray"
(or "grey"
) maps sRGB colors to greyscale using perceived
luminosity (biased towards green). "cmyk"
outputs in CMYK
colorspace. The simplest possible conversion from sRGB to CMYK is
used
(https://en.wikipedia.org/wiki/CMYK_color_model#Mapping_RGB_to_CMYK),
and raster images are output in RGB.
Also available for backwards compatibility is model "rgb"
which
uses uncalibrated RGB and corresponds to the model used with that name
in R prior to 2.13.0. Some viewers may render some plots in that
colorspace faster than in sRGB, and the plot files will be smaller.
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is 7 inches square.
Font sizes are in big points.
The default font family is Helvetica.
Line widths are as a multiple of 1/96 inch, with a minimum of 0.01 enforced.
Circles of any radius are allowed. If useDingbats =
TRUE
, opaque circles of less than 10 big points radius are
rendered using char 108 in the Dingbats font: all semi-transparent
and larger circles using a Bézier curve for each
quadrant.
Colours are by default specified as sRGB.
At very small line widths, the line type may be forced to solid.
Except on Windows it is possible to print directly from pdf
by
something like (this is appropriate for a CUPS printing system):
pdf("|lp -o landscape", paper = "a4r")
This forces onefile = TRUE
.
If you have drawn any typeset glyphs (see glyphInfo
)
then it is highly recommended that you use
embedGlyphs
to embed the relevant fonts.
If you see problems with PDF output, do remember that the problem is much more likely to be in your viewer than in R. Try another viewer if possible. Symptoms for which the viewer has been at fault are apparent grids on image plots (turn off graphics anti-aliasing in your viewer if you can) and missing or incorrect glyphs in text (viewers silently doing font substitution).
Unfortunately the default viewers on most Linux and macOS systems have these problems, and no obvious way to turn off graphics anti-aliasing.
Acrobat Reader does not use the fonts specified but rather emulates them from multiple-master fonts. This can be seen in imprecise centering of characters, for example the multiply and divide signs in Helvetica. This can be circumvented by embedding fonts where possible. Most other viewers substitute fonts, e.g. URW fonts for the standard Helvetica and Times fonts, and these too often have different font metrics from the true fonts.
Acrobat Reader can be extended by ‘font packs’, and these will be needed for the full use of encodings other than Latin-1 (although they may be offered for download as needed).
If useDingbats = TRUE
,
the default plotting character pch = 1
was
displayed in some PDF viewers incorrectly as a "q"
character. (These seem to be viewers based on the ‘poppler’ PDF
rendering library). This may be due to incorrect or incomplete mapping
of font names to those used by the system. Adding the following lines
to ‘~/.fonts.conf’ or ‘/etc/fonts/local.conf’ may circumvent
this problem, although this has largely been corrected on the affected
systems.
<fontconfig> <alias binding="same"> <family>ZapfDingbats</family> <accept><family>Dingbats</family></accept> </alias> </fontconfig>
Some further workarounds for problems with symbol fonts on
viewers using ‘fontconfig’ are given in the ‘Cairo Fonts’
section of the help for X11
.
The TeXworks PDF viewer was one of those which has been seen to fail to
display Dingbats (used by e.g. pch = 1
) correctly.
Whereas on other platforms the problems seen were incorrect output, on
Windows points were silently omitted: however recent versions seem to
manage to display Dingbats.
There was a different font bug in the pdf.js
viewer included
in Firefox: that mapped Dingbats to the Symbol font and so displayed
symbols such pch = 1
as lambda.
pdfFonts
, pdf.options
,
embedFonts
, glyphInfo
,
Devices
,
postscript
.
cairo_pdf
and (on macOS only) quartz
for other devices that can produce PDF.
More details of font families and encodings and especially handling text in a non-Latin-1 encoding and embedding fonts can be found in
Paul Murrell and Brian Ripley (2006). “Non-standard fonts in PostScript and PDF graphics.” R News, 6(2), 41–47. https://www.r-project.org/doc/Rnews/Rnews_2006-2.pdf.
## Test function for encodings TestChars <- function(encoding = "ISOLatin1", ...) { pdf(encoding = encoding, ...) par(pty = "s") plot(c(-1,16), c(-1,16), type = "n", xlab = "", ylab = "", xaxs = "i", yaxs = "i") title(paste("Centred chars in encoding", encoding)) grid(17, 17, lty = 1) for(i in c(32:255)) { x <- i %% 16 y <- i %/% 16 points(x, y, pch = i) } dev.off() } ## there will be many warnings. TestChars("ISOLatin2") ## this does not view properly in older viewers. TestChars("ISOLatin2", family = "URWHelvetica") ## works well for viewing in gs-based viewers, and often in xpdf.
## Test function for encodings TestChars <- function(encoding = "ISOLatin1", ...) { pdf(encoding = encoding, ...) par(pty = "s") plot(c(-1,16), c(-1,16), type = "n", xlab = "", ylab = "", xaxs = "i", yaxs = "i") title(paste("Centred chars in encoding", encoding)) grid(17, 17, lty = 1) for(i in c(32:255)) { x <- i %% 16 y <- i %/% 16 points(x, y, pch = i) } dev.off() } ## there will be many warnings. TestChars("ISOLatin2") ## this does not view properly in older viewers. TestChars("ISOLatin2", family = "URWHelvetica") ## works well for viewing in gs-based viewers, and often in xpdf.
The auxiliary function pdf.options
can be used to set or view
(if called without arguments) the default values for some of the
arguments to pdf
.
pdf.options
needs to be called before calling pdf
,
and the default values it sets can be overridden by supplying
arguments to pdf
.
pdf.options(..., reset = FALSE)
pdf.options(..., reset = FALSE)
... |
arguments |
reset |
logical: should the defaults be reset to their ‘factory-fresh’ values? |
If both reset = TRUE
and ...
are supplied the defaults
are first reset to the ‘factory-fresh’ values and then the new
values are applied.
A named list of all the defaults. If any arguments are supplied the return values are the old values and the result has the visibility flag turned off.
pdf.options(bg = "pink") utils::str(pdf.options()) pdf.options(reset = TRUE) # back to factory-fresh
pdf.options(bg = "pink") utils::str(pdf.options()) pdf.options(reset = TRUE) # back to factory-fresh
This function produces simple graphics suitable for inclusion in TeX and LaTeX documents. It dates from the very early days of R and is for historical interest only. It was deprecated in R 4.4.0. Consider the tikzDevice instead.
pictex(file = "Rplots.tex", width = 5, height = 4, debug = FALSE, bg = "white", fg = "black")
pictex(file = "Rplots.tex", width = 5, height = 4, debug = FALSE, bg = "white", fg = "black")
file |
the file path where output will appear.
Tilde expansion (see |
width |
The width of the plot in inches. |
height |
the height of the plot in inches. |
debug |
should debugging information be printed. |
bg |
the background color for the plot. Ignored. |
fg |
the foreground color for the plot. Ignored. |
This driver is much more basic than the other graphics drivers
included in R. It does not have any font metric information, so the
use of plotmath
is not supported.
Line widths are ignored except when setting the spacing of line textures.
pch = "."
corresponds to a square of side 1pt.
This device does not support colour (nor does the PicTeX package), and all colour settings are ignored.
Note that text is recorded in the file as-is, so annotations involving TeX special characters (such as ampersand and underscore) need to be quoted as they would be when entering TeX.
Multiple plots will be placed as separate environments in the output file.
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is 5 inches by 4 inches.
There is no pointsize
argument: the default size is
interpreted as 10 point.
The only font family is cmss10
.
Line widths are only used when setting the spacing on line textures.
Circle of any radius are allowed.
Colour is not supported.
This driver was provided around 1996–7 by Valerio Aimale of the Department of Internal Medicine, University of Genoa, Italy.
Knuth, D. E. (1984) The TeXbook. Reading, MA: Addison-Wesley.
Lamport, L. (1994) LATEX: A Document Preparation System. Reading, MA: Addison-Wesley.
Goossens, M., Mittelbach, F. and Samarin, A. (1994) The LATEX Companion. Reading, MA: Addison-Wesley.
pdf
, postscript
, Devices
.
The tikzDevice
in the CRAN package of that name for more modern
TeX-based graphics (https://pgf.sourceforge.net/, although
including PDF figures via pdftex
is most common
in (La)TeX documents).
require(graphics) pictex() plot(1:11, (-5:5)^2, type = "b", main = "Simple Example Plot") dev.off() ##-------------------- ## Not run: %% LaTeX Example \documentclass{article} \usepackage{pictex} \usepackage{graphics} % for \rotatebox \begin{document} %... \begin{figure}[h] \centerline{\input{Rplots.tex}} \caption{} \end{figure} %... \end{document} ## End(Not run) ##-------------------- unlink("Rplots.tex")
require(graphics) pictex() plot(1:11, (-5:5)^2, type = "b", main = "Simple Example Plot") dev.off() ##-------------------- ## Not run: %% LaTeX Example \documentclass{article} \usepackage{pictex} \usepackage{graphics} % for \rotatebox \begin{document} %... \begin{figure}[h] \centerline{\input{Rplots.tex}} \caption{} \end{figure} %... \end{document} ## End(Not run) ##-------------------- unlink("Rplots.tex")
If the text
argument to one of the text-drawing functions
(text
, mtext
, axis
,
legend
) in R is an expression, the argument is
interpreted as a mathematical expression and the output will be
formatted according to TeX-like rules. Expressions can also be used
for titles, subtitles and x- and y-axis labels (but not for axis
labels on persp
plots).
In most cases other language objects (names and calls, including formulas) are coerced to expressions and so can also be used.
A mathematical expression must obey the normal rules of syntax for any R expression, but it is interpreted according to very different rules than for normal R expressions.
It is possible to produce many different mathematical symbols, generate sub- or superscripts, produce fractions, etc.
The output from demo(plotmath)
includes several tables which
show the available features. In these tables, the columns of grey text
show sample R expressions, and the columns of black text show the
resulting output.
The available features are also described in the tables below:
Syntax | Meaning |
x + y |
x plus y |
x - y |
x minus y |
x*y |
juxtapose x and y |
x/y |
x forwardslash y |
x %+-% y |
x plus or minus y |
x %/% y |
x divided by y |
x %*% y |
x times y |
x %.% y |
x cdot y |
x[i] |
x subscript i |
x^2 |
x superscript 2 |
paste(x, y, z) |
juxtapose x, y, and z |
sqrt(x) |
square root of x |
sqrt(x, y) |
y-th root of x |
x == y |
x equals y |
x != y |
x is not equal to y |
x < y |
x is less than y |
x <= y |
x is less than or equal to y |
x > y |
x is greater than y |
x >= y |
x is greater than or equal to y |
!x |
not x |
x %~~% y |
x is approximately equal to y |
x %=~% y |
x and y are congruent |
x %==% y |
x is defined as y |
x %prop% y |
x is proportional to y |
x %~% y |
x is distributed as y |
plain(x) |
draw x in normal font |
bold(x) |
draw x in bold font |
italic(x) |
draw x in italic font |
bolditalic(x) |
draw x in bold italic font |
symbol(x) |
draw x in symbol font |
list(x, y, z) |
comma-separated list |
... |
ellipsis (height varies) |
cdots |
ellipsis (vertically centred) |
ldots |
ellipsis (at baseline) |
x %subset% y |
x is a proper subset of y |
x %subseteq% y |
x is a subset of y |
x %notsubset% y |
x is not a subset of y |
x %supset% y |
x is a proper superset of y |
x %supseteq% y |
x is a superset of y |
x %in% y |
x is an element of y |
x %notin% y |
x is not an element of y |
hat(x) |
x with a circumflex |
tilde(x) |
x with a tilde |
dot(x) |
x with a dot |
ring(x) |
x with a ring |
bar(xy) |
xy with bar |
widehat(xy) |
xy with a wide circumflex |
widetilde(xy) |
xy with a wide tilde |
x %<->% y |
x double-arrow y |
x %->% y |
x right-arrow y |
x %<-% y |
x left-arrow y |
x %up% y |
x up-arrow y |
x %down% y |
x down-arrow y |
x %<=>% y |
x is equivalent to y |
x %=>% y |
x implies y |
x %<=% y |
y implies x |
x %dblup% y |
x double-up-arrow y |
x %dbldown% y |
x double-down-arrow y |
alpha -- omega |
Greek symbols |
Alpha -- Omega |
uppercase Greek symbols |
theta1, phi1, sigma1, omega1 |
cursive Greek symbols |
Upsilon1 |
capital upsilon with hook |
aleph |
first letter of Hebrew alphabet |
infinity |
infinity symbol |
partialdiff |
partial differential symbol |
nabla |
nabla, gradient symbol |
32*degree |
32 degrees |
60*minute |
60 minutes of angle |
30*second |
30 seconds of angle |
displaystyle(x) |
draw x in normal size (extra spacing) |
textstyle(x) |
draw x in normal size |
scriptstyle(x) |
draw x in small size |
scriptscriptstyle(x) |
draw x in very small size |
underline(x) |
draw x underlined |
x ~~ y |
put extra space between x and y |
x + phantom(0) + y |
leave gap for "0", but don't draw it |
x + over(1, phantom(0)) |
leave vertical gap for "0" (don't draw) |
frac(x, y) |
x over y |
over(x, y) |
x over y |
atop(x, y) |
x over y (no horizontal bar) |
sum(x[i], i==1, n) |
sum x[i] for i equals 1 to n |
prod(plain(P)(X==x), x) |
product of P(X=x) for all values of x |
integral(f(x)*dx, a, b) |
definite integral of f(x) wrt x |
union(A[i], i==1, n) |
union of A[i] for i equals 1 to n |
intersect(A[i], i==1, n) |
intersection of A[i] |
lim(f(x), x %->% 0) |
limit of f(x) as x tends to 0 |
min(g(x), x > 0) |
minimum of g(x) for x greater than 0 |
inf(S) |
infimum of S |
sup(S) |
supremum of S |
x^y + z |
normal operator precedence |
x^(y + z) |
visible grouping of operands |
x^{y + z} |
invisible grouping of operands |
group("(",list(a, b),"]") |
specify left and right delimiters |
bgroup("(",atop(x,y),")") |
use scalable delimiters |
group(lceil, x, rceil) |
special delimiters |
group(lfloor, x, rfloor) |
special delimiters |
group(langle, list(x, y), rangle) |
special delimiters |
The supported ‘scalable delimiters’ are | ( [ {
and their right-hand versions.
"."
is equivalent to ""
: the corresponding delimiter
will be omitted. Delimiter ||
is supported but has the same
effect as |
.
The special delimiters lceil
, lfloor
, langle
(and their right-hand versions) are not scalable.
Note that paste
does not insert spaces when juxtaposing, unlike
(by default) the R function of that name.
The symbol font uses Adobe Symbol encoding so, for example, a lower
case mu can be obtained either by the special symbol mu
or by
symbol("m")
. This provides access to symbols that have no
special symbol name, for example, the universal, or forall, symbol is
symbol("\042")
. To see what symbols are available in this way
use TestChars(font=5)
as given in the examples for
points
: some are only available on some devices.
Note to TeX users: TeX's ‘\Upsilon’ is Upsilon1
, TeX's
‘\varepsilon’ is close to epsilon
, and there is no
equivalent of TeX's ‘\epsilon’. TeX's ‘\varpi’ is close to
omega1
. vartheta
, varphi
and varsigma
are
allowed as synonyms for theta1
, phi1
and sigma1
.
sigma1
is also known as stigma
, its Unicode name.
Control characters (e.g., ‘\n’) are not interpreted in character strings in plotmath, unlike normal plotting.
The fonts used are taken from the current font family, and so can be
set by par(family=)
in base graphics, and
gpar(fontfamily=)
in package grid.
Note that bold
, italic
and bolditalic
do not
apply to symbols, and hence not to the Greek symbols such as
mu
which are displayed in the symbol font. They also do not
apply to numeric constants.
On many OSes and some graphics devices many other symbols are
available as part of the standard text font, and all of the symbols in
the Adobe Symbol encoding are in principle available via
changing the font face or (see ‘Details’) plotmath: see the
examples section of points
for a function to display
them. (‘In principle’ because some of the glyphs are missing
from some implementations of the symbol font.) Unfortunately,
pdf
and postscript
have support for little
more than European (not Greek) and CJK characters and the Adobe Symbol
encoding (and in a few fonts, also Cyrillic characters).
In a UTF-8 locale any Unicode character can be entered, perhaps as a
‘\uxxxx’ or ‘\Uxxxxxxxx’ escape sequence, but the issue is
whether the graphics device is able to display the character. The
widest range of characters is likely to be available in the
X11
device using cairo: see its help page for how
installing additional fonts can help. This can often be used to
display Greek letters in bold or italic.
On macOS the quartz
device and the default system fonts
have quite large coverage.
In non-UTF-8 locales there is normally no support for symbols not in the languages for which the current encoding was intended.
Any Unicode character can be entered into a text string via a
‘\uxxxx’ escape, or used by number in a call to
points
. The windows
family of devices can
display such characters if they are available in the font in use.
This can often be used to display Greek letters in bold or italic.
A good way to both find out which characters are available in a font
and to determine the Unicode number is to use the ‘Character
Map’ accessory (usually on the ‘Start’ menu under
‘Accessories->System Tools’). You can also copy-and-paste
characters from the ‘Character Map’ window to the Rgui
console (but not to Rterm
).
Murrell, P. and Ihaka, R. (2000). An approach to providing mathematical annotation in plots. Journal of Computational and Graphical Statistics, 9, 582–599. doi:10.2307/1390947.
A list of the symbol codes can be found in decimal, octal and hex at https://www.stat.auckland.ac.nz/~paul/R/CM/AdobeSym.html.
demo(plotmath)
,
axis
,
mtext
,
text
,
title
,
substitute
quote
, bquote
require(graphics) x <- seq(-4, 4, length.out = 101) y <- cbind(sin(x), cos(x)) matplot(x, y, type = "l", xaxt = "n", main = expression(paste(plain(sin) * phi, " and ", plain(cos) * phi)), ylab = expression("sin" * phi, "cos" * phi), # only 1st is taken xlab = expression(paste("Phase Angle ", phi)), col.main = "blue") axis(1, at = c(-pi, -pi/2, 0, pi/2, pi), labels = expression(-pi, -pi/2, 0, pi/2, pi)) ## How to combine "math" and numeric variables : plot(1:10, type="n", xlab="", ylab="", main = "plot math & numbers") theta <- 1.23 ; mtext(bquote(hat(theta) == .(theta)), line= .25) for(i in 2:9) text(i, i+1, substitute(list(xi, eta) == group("(",list(x,y),")"), list(x = i, y = i+1))) ## note that both of these use calls rather than expressions. ## text(1, 10, "Derivatives:", adj = 0) text(1, 9.6, expression( " first: {f * minute}(x) " == {f * minute}(x)), adj = 0) text(1, 9.0, expression( " second: {f * second}(x) " == {f * second}(x)), adj = 0) ## note the "{ .. }" trick to get "chained" equations: plot(1:10, 1:10, main = quote(1 <= {1 < 2})) text(4, 9, expression(hat(beta) == (X^t * X)^{-1} * X^t * y)) text(4, 8.4, "expression(hat(beta) == (X^t * X)^{-1} * X^t * y)", cex = .8) text(4, 7, expression(bar(x) == sum(frac(x[i], n), i==1, n))) text(4, 6.4, "expression(bar(x) == sum(frac(x[i], n), i==1, n))", cex = .8) text(8, 5, expression(paste(frac(1, sigma*sqrt(2*pi)), " ", plain(e)^{frac(-(x-mu)^2, 2*sigma^2)})), cex = 1.2) ## some other useful symbols plot.new(); plot.window(c(0,4), c(15,1)) text(1, 1, "universal", adj = 0); text(2.5, 1, "\\042") text(3, 1, expression(symbol("\042"))) text(1, 2, "existential", adj = 0); text(2.5, 2, "\\044") text(3, 2, expression(symbol("\044"))) text(1, 3, "suchthat", adj = 0); text(2.5, 3, "\\047") text(3, 3, expression(symbol("\047"))) text(1, 4, "therefore", adj = 0); text(2.5, 4, "\\134") text(3, 4, expression(symbol("\134"))) text(1, 5, "perpendicular", adj = 0); text(2.5, 5, "\\136") text(3, 5, expression(symbol("\136"))) text(1, 6, "circlemultiply", adj = 0); text(2.5, 6, "\\304") text(3, 6, expression(symbol("\304"))) text(1, 7, "circleplus", adj = 0); text(2.5, 7, "\\305") text(3, 7, expression(symbol("\305"))) text(1, 8, "emptyset", adj = 0); text(2.5, 8, "\\306") text(3, 8, expression(symbol("\306"))) text(1, 9, "angle", adj = 0); text(2.5, 9, "\\320") text(3, 9, expression(symbol("\320"))) text(1, 10, "leftangle", adj = 0); text(2.5, 10, "\\341") text(3, 10, expression(symbol("\341"))) text(1, 11, "rightangle", adj = 0); text(2.5, 11, "\\361") text(3, 11, expression(symbol("\361")))
require(graphics) x <- seq(-4, 4, length.out = 101) y <- cbind(sin(x), cos(x)) matplot(x, y, type = "l", xaxt = "n", main = expression(paste(plain(sin) * phi, " and ", plain(cos) * phi)), ylab = expression("sin" * phi, "cos" * phi), # only 1st is taken xlab = expression(paste("Phase Angle ", phi)), col.main = "blue") axis(1, at = c(-pi, -pi/2, 0, pi/2, pi), labels = expression(-pi, -pi/2, 0, pi/2, pi)) ## How to combine "math" and numeric variables : plot(1:10, type="n", xlab="", ylab="", main = "plot math & numbers") theta <- 1.23 ; mtext(bquote(hat(theta) == .(theta)), line= .25) for(i in 2:9) text(i, i+1, substitute(list(xi, eta) == group("(",list(x,y),")"), list(x = i, y = i+1))) ## note that both of these use calls rather than expressions. ## text(1, 10, "Derivatives:", adj = 0) text(1, 9.6, expression( " first: {f * minute}(x) " == {f * minute}(x)), adj = 0) text(1, 9.0, expression( " second: {f * second}(x) " == {f * second}(x)), adj = 0) ## note the "{ .. }" trick to get "chained" equations: plot(1:10, 1:10, main = quote(1 <= {1 < 2})) text(4, 9, expression(hat(beta) == (X^t * X)^{-1} * X^t * y)) text(4, 8.4, "expression(hat(beta) == (X^t * X)^{-1} * X^t * y)", cex = .8) text(4, 7, expression(bar(x) == sum(frac(x[i], n), i==1, n))) text(4, 6.4, "expression(bar(x) == sum(frac(x[i], n), i==1, n))", cex = .8) text(8, 5, expression(paste(frac(1, sigma*sqrt(2*pi)), " ", plain(e)^{frac(-(x-mu)^2, 2*sigma^2)})), cex = 1.2) ## some other useful symbols plot.new(); plot.window(c(0,4), c(15,1)) text(1, 1, "universal", adj = 0); text(2.5, 1, "\\042") text(3, 1, expression(symbol("\042"))) text(1, 2, "existential", adj = 0); text(2.5, 2, "\\044") text(3, 2, expression(symbol("\044"))) text(1, 3, "suchthat", adj = 0); text(2.5, 3, "\\047") text(3, 3, expression(symbol("\047"))) text(1, 4, "therefore", adj = 0); text(2.5, 4, "\\134") text(3, 4, expression(symbol("\134"))) text(1, 5, "perpendicular", adj = 0); text(2.5, 5, "\\136") text(3, 5, expression(symbol("\136"))) text(1, 6, "circlemultiply", adj = 0); text(2.5, 6, "\\304") text(3, 6, expression(symbol("\304"))) text(1, 7, "circleplus", adj = 0); text(2.5, 7, "\\305") text(3, 7, expression(symbol("\305"))) text(1, 8, "emptyset", adj = 0); text(2.5, 8, "\\306") text(3, 8, expression(symbol("\306"))) text(1, 9, "angle", adj = 0); text(2.5, 9, "\\320") text(3, 9, expression(symbol("\320"))) text(1, 10, "leftangle", adj = 0); text(2.5, 10, "\\341") text(3, 10, expression(symbol("\341"))) text(1, 11, "rightangle", adj = 0); text(2.5, 11, "\\361") text(3, 11, expression(symbol("\361")))
Graphics devices for BMP, JPEG, PNG and TIFF format bitmap files.
bmp(filename = "Rplot%03d.bmp", width = 480, height = 480, units = "px", pointsize = 12, bg = "white", res = NA, ..., type = c("cairo", "Xlib", "quartz"), antialias) jpeg(filename = "Rplot%03d.jpeg", width = 480, height = 480, units = "px", pointsize = 12, quality = 75, bg = "white", res = NA, ..., type = c("cairo", "Xlib", "quartz"), antialias) png(filename = "Rplot%03d.png", width = 480, height = 480, units = "px", pointsize = 12, bg = "white", res = NA, ..., type = c("cairo", "cairo-png", "Xlib", "quartz"), antialias) tiff(filename = "Rplot%03d.tiff", width = 480, height = 480, units = "px", pointsize = 12, compression = c("none", "rle", "lzw", "jpeg", "zip", "lzw+p", "zip+p", "lerc", "lzma", "zstd", "webp"), bg = "white", res = NA, ..., type = c("cairo", "Xlib", "quartz"), antialias)
bmp(filename = "Rplot%03d.bmp", width = 480, height = 480, units = "px", pointsize = 12, bg = "white", res = NA, ..., type = c("cairo", "Xlib", "quartz"), antialias) jpeg(filename = "Rplot%03d.jpeg", width = 480, height = 480, units = "px", pointsize = 12, quality = 75, bg = "white", res = NA, ..., type = c("cairo", "Xlib", "quartz"), antialias) png(filename = "Rplot%03d.png", width = 480, height = 480, units = "px", pointsize = 12, bg = "white", res = NA, ..., type = c("cairo", "cairo-png", "Xlib", "quartz"), antialias) tiff(filename = "Rplot%03d.tiff", width = 480, height = 480, units = "px", pointsize = 12, compression = c("none", "rle", "lzw", "jpeg", "zip", "lzw+p", "zip+p", "lerc", "lzma", "zstd", "webp"), bg = "white", res = NA, ..., type = c("cairo", "Xlib", "quartz"), antialias)
filename |
the output file path.
The page number is substituted if a C integer format is included in
the character string, as in the default. (Depending on the platform,
the result should be less
than |
width |
the width of the device. |
height |
the height of the device. |
units |
The units in which |
pointsize |
the default pointsize of plotted text, interpreted as
big points (1/72 inch) at |
bg |
the initial background colour: can be overridden by setting
|
quality |
the ‘quality’ of the JPEG image, as a percentage. Smaller values will give more compression but also more degradation of the image. |
compression |
the type of compression to be used. Can also be a
numeric value supported by the underlying |
res |
The nominal resolution in ppi which will be recorded in the
bitmap file, if a positive integer. Also used for |
... |
for For types For type |
type |
character string, one of |
antialias |
for |
Plots in PNG and JPEG format can easily be converted to many other
bitmap formats, and both can be displayed in modern web browsers. The
PNG format is lossless and is best for line diagrams and blocks of
colour. The JPEG format is lossy, but may be useful for image plots,
for example. BMP is a standard format on Windows. TIFF is a
meta-format: the default format written by tiff
is lossless and
stores RGB (and alpha where appropriate) values uncompressed—such
files are widely accepted, which is their main virtue over PNG.
The JPEG format only supports opaque backgrounds.
png
supports transparent backgrounds: use bg =
"transparent"
. (Not all PNG viewers render files with transparency
correctly.) When transparency is in use in the type = "Xlib"
variant a very light grey is used as the background and so appears as
transparent if used in the plot. This allows opaque white to be used,
as in the example. The type = "cairo"
, type =
"cairo-png"
and type = "quartz"
variants allow
semi-transparent colours, including on a transparent or
semi-transparent background.
tiff
with types "cairo"
and "quartz"
supports
semi-transparent colours, including on a transparent or
semi-transparent background. Compression type "zip"
is
‘deflate (Adobe-style)’. Compression types "lzw+p"
and
"zip+p"
use horizontal differencing (‘differencing
predictor’, section 14 of the TIFF specification) in combination with
the compression method, which is effective for continuous-tone images,
especially colour ones.
The jpeg
quality when used for tiff
compression is fixed
at 75.
R can be compiled without support for some or all of the types for
each of these devices: this will be reported if you attempt to use
them on a system where they are not supported. For type =
"Xlib"
they may not be usable unless the X11 display is available to
the owner of the R process. type = "cairo"
requires cairo 1.2
or later. type = "quartz"
uses the quartz
device
and so is only available where that is (on some macOS builds: see
capabilities("aqua")
).
By default no resolution is recorded in the file, except for BMP. Viewers will often assume a nominal resolution of 72 ppi when none is recorded. As resolutions in PNG files are recorded in pixels/metre, the reported ppi value will be changed slightly.
For graphics parameters that make use of dimensions in inches
(including font sizes in points) the resolution used is res
(or
72 ppi if unset).
png
will normally use a palette if there are less than 256
colours on the page, and record a 24-bit RGB file otherwise (or a
32-bit ARGB file if type = "cairo"
and non-opaque colours are
used). However, type = "cairo-png"
uses cairographics' PNG
backend which will never use a palette and normally creates a larger
32-bit ARGB file—this may work better for specialist uses with
semi-transparent colours.
Quartz-produced PNG and TIFF plots with a transparent background are
recorded with a dark grey matte which will show up in some viewers,
including Preview
on macOS.
Unknown resolutions in BMP files are recorded as 72 ppi.
A plot device is opened: nothing is returned to the R interpreter.
Note that by default the width
and height
values are in
pixels not inches. A warning will be issued if both are less than 20.
If you plot more than one page on one of these devices and do not
include something like %d
for the sequence number in
file
, the file will contain the last page plotted.
These functions are interfaces to three or more different underlying devices.
On Windows, devices based on plotting to a hidden screen using Windows' GDI calls.
On platforms with support for X11, plotting to a hidden X11 display.
On macOS when working at the console and when R is compiled with suitable support, using Apple's Quartz plotting system.
Where support has been compiled in for cairographics, plotting
on cairo surfaces. This may use the native platform support for
fonts, or it may use fontconfig
to support a wide range of
font formats.
Inevitably there will be differences between the options supported and output produced. Perhaps the most important are support for antialiased fonts and semi-transparent colours: the best results are likely to be obtained with the cairo- or Quartz-based devices where available.
The default extensions are ‘.jpg’ and ‘.tif’ on Windows, and ‘.jpeg’ and ‘.tiff’ elsewhere.
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is in pixels.
Font sizes are in big points interpreted at res
ppi.
The default font family is Helvetica.
Line widths in 1/96 inch (interpreted at res
ppi),
minimum one pixel for type = "Xlib"
, 0.01 for type =
"cairo"
.
For type = "Xlib"
circle radii are in pixels with
minimum one.
Colours are interpreted by the viewing application.
For type = "quartz"
see the help for quartz
.
For type = "Xlib"
these devices are based on the X11
device. The colour model used will be that set up by
X11.options
at the time the first Xlib-based devices was opened
(or the first after all such devices have been closed).
Support for compression types depends on the underlying ‘libtiff’
library: types "lerc"
, "lzma"
, "zstd"
and
"webp"
are relatively recent additions and may well not be
supported. They are also liable to be unsupported in TIFF viewers.
Guido Masarotto and Brian Ripley
The PNG specification, https://www.w3.org/TR/png/.
The TIFF specification, https://www.iso.org/standard/34342.html. See also https://en.wikipedia.org/wiki/TIFF.
capabilities
to see if these devices are
supported by this build of R, and if type = "cairo"
is supported.
bitmap
provides an alternative way to generate plots in many
bitmap formats that does not depend on accessing the X11 display but does
depend on having GhostScript installed.
Ways to write raster images to bitmap formats are available in packages jpeg, png and tiff.
## these examples will work only if the devices are available ## and cairo or an X11 display or a macOS display is available. ## copy current plot to a (large) PNG file ## Not run: dev.print(png, filename = "myplot.png", width = 1024, height = 768) png("myplot.png", bg = "transparent") plot(1:10) rect(1, 5, 3, 7, col = "white") dev.off() ## will make myplot1.jpeg and myplot2.jpeg jpeg("myplot%d.jpeg") example(rect) dev.off()
## these examples will work only if the devices are available ## and cairo or an X11 display or a macOS display is available. ## copy current plot to a (large) PNG file ## Not run: dev.print(png, filename = "myplot.png", width = 1024, height = 768) png("myplot.png", bg = "transparent") plot(1:10) rect(1, 5, 3, 7, col = "white") dev.off() ## will make myplot1.jpeg and myplot2.jpeg jpeg("myplot%d.jpeg") example(rect) dev.off()
postscript
starts the graphics device driver for producing
PostScript graphics.
postscript(file = if(onefile) "Rplots.ps" else "Rplot%03d.ps", onefile, family, title, fonts, encoding, bg, fg, width, height, horizontal, pointsize, paper, pagecentre, print.it, command, colormodel, useKerning, fillOddEven)
postscript(file = if(onefile) "Rplots.ps" else "Rplot%03d.ps", onefile, family, title, fonts, encoding, bg, fg, width, height, horizontal, pointsize, paper, pagecentre, print.it, command, colormodel, useKerning, fillOddEven)
file |
a character string giving the file path. If it is
For use with Tilde expansion (see See also section ‘File specifications’ in the help
for |
onefile |
logical: if true (the default) allow multiple figures
in one file. If false, generate a file name containing the page
number for each page and use an EPSF header and no
|
family |
the initial font family to be used, see the section
‘Families’ in |
title |
title string to embed as the |
fonts |
a character vector specifying additional R graphics font
family names for font families whose declarations will be included
in the PostScript file and are available for use with the device.
See ‘Families’ below. Defaults to |
encoding |
the name of an encoding file. See
|
bg |
the initial background color to be used. If
|
fg |
the initial foreground color to be used. Defaults to
|
width , height
|
the width and height of the graphics region in
inches. Default to If |
horizontal |
the orientation of the printed image, a logical. Defaults to true, that is landscape orientation on paper sizes with width less than height. |
pointsize |
the default point size to be used. Strictly
speaking, in bp, that is 1/72 of an inch, but approximately in
points. Defaults to |
paper |
the size of paper in the printer. The choices are
|
pagecentre |
logical: should the device region be centred on the page? Defaults to true. |
print.it |
logical: should the file be printed when the device is
closed? (This only applies if |
command |
the command to be used for ‘printing’. Defaults
to |
colormodel |
a character string describing the color model:
currently allowed values as |
useKerning |
logical. Should kerning corrections be included in
setting text and calculating string widths? Defaults to |
fillOddEven |
logical controlling the polygon fill mode: see
|
All arguments except file
default to values given by
ps.options()
. The ultimate defaults are quoted in the
arguments section.
postscript
opens the file file
and the PostScript
commands needed to plot any graphics requested are written to that
file. This file can then be printed on a suitable device to obtain
hard copy.
The file
argument is interpreted as a C integer format as used
by sprintf
, with integer argument the page number.
The default gives files ‘Rplot001.ps’, ..., ‘Rplot999.ps’,
‘Rplot1000.ps’, ....
The postscript produced for a single R plot is EPS (Encapsulated
PostScript) compatible, and can be included into other documents,
e.g., into LaTeX, using ‘\includegraphics{<filename>}’. For use
in this way you will probably want to use setEPS()
to
set the defaults as horizontal = FALSE, onefile = FALSE, paper =
"special"
. Note that the bounding box is for the device
region: if you find the white space around the plot region excessive,
reduce the margins of the figure region via par(mar = )
.
Most of the PostScript prologue used is taken from the R character
vector .ps.prolog
. This is marked in the output, and can be
changed by changing that vector. (This is only advisable for
PostScript experts: the standard version is in
namespace:grDevices
.)
A PostScript device has a default family, which can be set by the user
via family
. If other font families are to be used when drawing
to the PostScript device, these must be declared when the device is
created via fonts
; the font family names for this argument are
R graphics font family names (see the documentation for
postscriptFonts
).
Line widths as controlled by par(lwd = )
are in multiples of
1/96 inch: multiples less than 1 are allowed. pch = "."
with
cex = 1
corresponds to a square of side 1/72 inch, which is
also the ‘pixel’ size assumed for graphics parameters such as
"cra"
.
When the background colour is fully transparent (as is the initial default value), the PostScript produced does not paint the background. Almost all PostScript viewers will use a white canvas so the visual effect is if the background were white. This will not be the case when printing onto coloured paper, though.
TeX has traditionally made use of fonts such as Computer Modern which
are encoded rather differently, in a 7-bit encoding. This encoding
can be specified by encoding = "TeXtext.enc"
, taking care that
the ASCII characters < > \ _ { }
are not available in those
fonts.
There are supplied families "ComputerModern"
and
"ComputerModernItalic"
which use this encoding, and which are
only supported for postscript
(and not pdf
). They are
intended to use with the Type 1 versions of the TeX CM fonts. It will
normally be possible to include such output in TeX or LaTeX provided
it is processed with dvips -Ppfb -j0
or the equivalent on your
system. (-j0
turns off font subsetting.) When family =
"ComputerModern"
is used, the italic/bold-italic fonts used are
slanted fonts (cmsl10
and cmbxsl10
). To use text italic
fonts instead, set family = "ComputerModernItalic"
.
These families use the TeX math italic and symbol fonts for a comprehensive but incomplete coverage of the glyphs covered by the Adobe symbol font in other families. This is achieved by special-casing the postscript code generated from the supplied ‘CM_symbol_10.afm’.
The default color model ("srgb"
) is sRGB.
The alternative "srgb+gray"
uses sRGB for colors, but with pure
gray colors (including black and white) expressed as greyscales (which
results in smaller files and can be advantageous with some printer
drivers). Conversely, its files can be rendered much slower on some
viewers, and there can be a noticeable discontinuity in color
gradients involving gray or white.
Other possibilities are "gray"
(or "grey"
) which used
only greyscales (and converts other colours to a luminance), and
"cmyk"
. The simplest possible conversion from sRGB to CMYK is
used
(https://en.wikipedia.org/wiki/CMYK_color_model#Mapping_RGB_to_CMYK),
and raster images are output in RGB.
Color models provided for backwards compatibility are "rgb"
(which is RGB+gray) and "rgb-nogray"
which use uncalibrated RGB
(as used in R prior to 2.13.0). These result in slightly smaller
files which may render faster, but do rely on the viewer being
properly calibrated.
A postscript plot can be printed via postscript
in two ways.
Setting print.it = TRUE
causes the command given in
argument command
to be called with argument "file"
when the device is closed. Note that the plot file is not deleted
unless command
arranges to delete it.
file = ""
or file = "|cmd"
can be used to print
using a pipe. Failure to open the command will probably be reported
to the terminal but not to R, in which case close the
device by dev.off
immediately.
On Windows the default
"printcmd"
is empty and will give an error if
print.it = TRUE
is used. Suitable commands to spool a PostScript
file to a printer can be found in ‘RedMon’ suite available from
http://pages.cs.wisc.edu/~ghost/index.html. The command will be
run in a minimized window. GSView 4.x provides ‘gsprint.exe’
which may be more convenient (it requires Ghostscript version 6.50
or later).
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is 7 inches square.
Font sizes are in big points.
The default font family is Helvetica.
Line widths are as a multiple of 1/96 inch, with a minimum of 0.01 enforced.
Circle of any radius are allowed.
Colours are by default specified as sRGB.
At very small line widths, the line type may be forced to solid.
Raster images are currently limited to opaque colours.
If you see problems with postscript output, do remember that the problem is much more likely to be in your viewer than in R. Try another viewer if possible. Symptoms for which the viewer has been at fault are apparent grids on image plots (turn off graphics anti-aliasing in your viewer if you can) and missing or incorrect glyphs in text (viewers silently doing font substitution).
Unfortunately the default viewers on most Linux and macOS systems have these problems, and no obvious way to turn off graphics anti-aliasing.
Support for Computer Modern fonts is based on a contribution by Brian D'Urso [email protected].
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
postscriptFonts
,
Devices
,
and check.options
which is called from both
ps.options
and postscript
.
cairo_ps
for another device that can produce PostScript.
More details of font families and encodings and especially handling text in a non-Latin-1 encoding and embedding fonts can be found in
Paul Murrell and Brian Ripley (2006). “Non-standard fonts in PostScript and PDF graphics.” R News, 6(2), 41–47. https://www.r-project.org/doc/Rnews/Rnews_2006-2.pdf.
require(graphics) ## Not run: # open the file "foo.ps" for graphics output postscript("foo.ps") # produce the desired graph(s) dev.off() # turn off the postscript device ## On Unix-alikes only: postscript("|lp -dlw") # produce the desired graph(s) dev.off() # plot will appear on printer ## On Windows: options(printcmd = 'redpr -P"\\printhost\lw"') postscript(file = tempfile("Rps."), print.it = TRUE) # produce the desired graph(s) dev.off() # send plot file to the printer ## alternative using GSView 4.x : options(printcmd = '/GhostGum/gsview/gsprint -query') # for URW PostScript devices postscript("foo.ps", family = "NimbusSan") ## for inclusion in Computer Modern TeX documents, perhaps postscript("cm_test.eps", width = 4.0, height = 3.0, horizontal = FALSE, onefile = FALSE, paper = "special", family = "ComputerModern", encoding = "TeXtext.enc") ## The resultant postscript file can be used by dvips -Ppfb -j0. ## To test out encodings, you can use TestChars <- function(encoding = "ISOLatin1", family = "URWHelvetica") { postscript(encoding = encoding, family = family) par(pty = "s") plot(c(-1,16), c(-1,16), type = "n", xlab = "", ylab = "", xaxs = "i", yaxs = "i") title(paste("Centred chars in encoding", encoding)) grid(17, 17, lty = 1) for(i in c(32:255)) { x <- i %% 16 y <- i %/% 16 points(x, y, pch = i) } dev.off() } ## there will be many warnings. We use URW to get a complete enough ## set of font metrics. TestChars() TestChars("ISOLatin2") TestChars("WinAnsi") ## End(Not run)
require(graphics) ## Not run: # open the file "foo.ps" for graphics output postscript("foo.ps") # produce the desired graph(s) dev.off() # turn off the postscript device ## On Unix-alikes only: postscript("|lp -dlw") # produce the desired graph(s) dev.off() # plot will appear on printer ## On Windows: options(printcmd = 'redpr -P"\\printhost\lw"') postscript(file = tempfile("Rps."), print.it = TRUE) # produce the desired graph(s) dev.off() # send plot file to the printer ## alternative using GSView 4.x : options(printcmd = '/GhostGum/gsview/gsprint -query') # for URW PostScript devices postscript("foo.ps", family = "NimbusSan") ## for inclusion in Computer Modern TeX documents, perhaps postscript("cm_test.eps", width = 4.0, height = 3.0, horizontal = FALSE, onefile = FALSE, paper = "special", family = "ComputerModern", encoding = "TeXtext.enc") ## The resultant postscript file can be used by dvips -Ppfb -j0. ## To test out encodings, you can use TestChars <- function(encoding = "ISOLatin1", family = "URWHelvetica") { postscript(encoding = encoding, family = family) par(pty = "s") plot(c(-1,16), c(-1,16), type = "n", xlab = "", ylab = "", xaxs = "i", yaxs = "i") title(paste("Centred chars in encoding", encoding)) grid(17, 17, lty = 1) for(i in c(32:255)) { x <- i %% 16 y <- i %/% 16 points(x, y, pch = i) } dev.off() } ## there will be many warnings. We use URW to get a complete enough ## set of font metrics. TestChars() TestChars("ISOLatin2") TestChars("WinAnsi") ## End(Not run)
These functions handle the translation of a R graphics
font family name to a PostScript or PDF font description, used by the
postscript
or pdf
graphics devices.
postscriptFonts(...) pdfFonts(...)
postscriptFonts(...) pdfFonts(...)
... |
either character strings naming mappings to display, or named arguments specifying mappings to add or change. |
If these functions are called with no argument they list all the existing mappings, whereas if they are called with named arguments they add (or change) mappings.
A PostScript or PDF device is created with a default font family (see the
documentation for postscript
), but it is also possible
to specify a font family when drawing to the device (for example, see
the documentation for "family"
in par
and for
"fontfamily"
in gpar
in the grid package).
The font family sent to the device is a simple string name, which must be
mapped to a set of PostScript fonts. Separate lists of mappings for
postscript
and pdf
devices are maintained for the
current R session and can be added to by the user.
The postscriptFonts
and pdfFonts
functions can be used
to list existing mappings and to define new mappings. The
Type1Font
and CIDFont
functions can be
used to create new mappings, when the xxxFonts
function is used
to add them to the database. See the examples.
Default mappings are provided for three device-independent family
names: "sans"
for a sans-serif font (to "Helvetica"
),
"serif"
for a serif font (to "Times"
) and "mono"
for a monospaced font (to "Courier"
).
Mappings for a number of standard Adobe fonts (and URW equivalents)
are also provided: "AvantGarde"
,
"Bookman"
, "Courier"
, "Helvetica"
,
"Helvetica-Narrow"
, "NewCenturySchoolbook"
,
"Palatino"
and "Times"
;
"URWGothic"
, "URWBookman"
, "NimbusMon"
,
"NimbusSan"
(synonym "URWHelvetica"
),
"NimbusSanCond"
, "CenturySch"
, "URWPalladio"
and
"NimbusRom"
(synonym "URWTimes"
).
There are also mappings for "ComputerModern"
,
"ComputerModernItalic"
and "ArialMT"
(Monotype Arial).
Finally, there are some default mappings for East Asian locales described in a separate section.
The specification of font metrics and encodings is described in the help
for the postscript
function.
The fonts are not embedded in the resulting PostScript or PDF file, so
software including the PostScript or PDF plot file should either embed
the font outlines (usually from ‘.pfb’ or ‘.pfa’ files) or
use DSC comments to instruct the print spooler or including
application to do so (see also embedFonts
).
A font family has both an R-level name, the argument name used when
postscriptFonts
was called, and an internal name, the
family
component. These two names are the same for all the
pre-defined font families.
Once a font family is in use it cannot be changed. ‘In use’
means that it has been specified via a family
or
fonts
argument to an invocation of the same graphics device
already in the R session. (For these purposes xfig
counts the
same as postscript
but only uses some of the predefined mappings.)
A list of one or more font mappings.
There are some default mappings for East Asian locales:"Japan1"
, "Japan1HeiMin"
, "Japan1GothicBBB"
,
and "Japan1Ryumin"
for Japanese;
"Korea1"
and "Korea1deb"
for Korean;
"GB1"
(Simplified Chinese) for mainland China and Singapore;
"CNS1"
(Traditional Chinese) for Hong Kong and Taiwan.
These refer to the following fonts
Japan1 (PS) | HeiseiKakuGo-W5
|
Linotype Japanese printer font | |
Japan1 (PDF) | KozMinPro-Regular-Acro
|
from Adobe Reader 7.0 Japanese Font Pack | |
Japan1HeiMin (PS) | HeiseiMin-W3
|
Linotype Japanese printer font | |
Japan1HeiMin (PDF) | HeiseiMin-W3-Acro
|
from Adobe Reader 7.0 Japanese Font Pack | |
Japan1GothicBBB | GothicBBB-Medium
|
Japanese-market PostScript printer font | |
Japan1Ryumin | Ryumin-Light
|
Japanese-market PostScript printer font | |
Korea1 (PS) | Baekmuk-Batang
|
TrueType font found on some Linux systems | |
Korea1 (PDF) | HYSMyeongJoStd-Medium-Acro
|
from Adobe Reader 7.0 Korean Font Pack | |
Korea1deb (PS) | Batang-Regular
|
another name for Baekmuk-Batang | |
Korea1deb (PDF) | HYGothic-Medium-Acro
|
from Adobe Reader 4.0 Korean Font Pack | |
GB1 (PS) | BousungEG-Light-GB
|
TrueType font found on some Linux systems | |
GB1 (PDF) | STSong-Light-Acro
|
from Adobe Reader 7.0 Simplified Chinese Font Pack | |
CNS1 (PS) | MOESung-Regular
|
Ken Lunde's CJKV resources | |
CNS1 (PDF) | MSungStd-Light-Acro
|
from Adobe Reader 7.0 Traditional Chinese Font Pack | |
BousungEG-Light-GB
can be found at
https://ftp.gnu.org/pub/non-gnu/chinese-fonts-truetype/.
These will need to be installed or otherwise made available to the
PostScript/PDF interpreter such as Ghostscript (and not all
interpreters can handle TrueType fonts).
You may well find that your postscript/PDF interpreters has been set
up to provide aliases for many of these fonts. For example,
Ghostscript on Windows can optionally be installed to map common East
Asian fonts names to Windows TrueType fonts. (You may want to add the
-Acro
versions as well.)
Adding a mapping for a CID-keyed font is for gurus only.
Support for Computer Modern fonts is based on a contribution by Brian D'Urso.
postscript
and pdf
; Type1Font
and CIDFont
for specifying new font mappings.
postscriptFonts() ## This duplicates "ComputerModernItalic". CMitalic <- Type1Font("ComputerModern2", c("CM_regular_10.afm", "CM_boldx_10.afm", "cmti10.afm", "cmbxti10.afm", "CM_symbol_10.afm"), encoding = "TeXtext.enc") postscriptFonts(CMitalic = CMitalic) ## A CID font for Japanese using a different CMap and ## corresponding cmapEncoding. `Jp_UCS-2` <- CIDFont("TestUCS2", c("Adobe-Japan1-UniJIS-UCS2-H.afm", "Adobe-Japan1-UniJIS-UCS2-H.afm", "Adobe-Japan1-UniJIS-UCS2-H.afm", "Adobe-Japan1-UniJIS-UCS2-H.afm"), "UniJIS-UCS2-H", "UCS-2") pdfFonts(`Jp_UCS-2` = `Jp_UCS-2`) names(pdfFonts())
postscriptFonts() ## This duplicates "ComputerModernItalic". CMitalic <- Type1Font("ComputerModern2", c("CM_regular_10.afm", "CM_boldx_10.afm", "cmti10.afm", "cmbxti10.afm", "CM_symbol_10.afm"), encoding = "TeXtext.enc") postscriptFonts(CMitalic = CMitalic) ## A CID font for Japanese using a different CMap and ## corresponding cmapEncoding. `Jp_UCS-2` <- CIDFont("TestUCS2", c("Adobe-Japan1-UniJIS-UCS2-H.afm", "Adobe-Japan1-UniJIS-UCS2-H.afm", "Adobe-Japan1-UniJIS-UCS2-H.afm", "Adobe-Japan1-UniJIS-UCS2-H.afm"), "UniJIS-UCS2-H", "UCS-2") pdfFonts(`Jp_UCS-2` = `Jp_UCS-2`) names(pdfFonts())
Compute a sequence of about n+1
equally spaced ‘nice’
values which cover the range of the values in x
, possibly of
length one, when min.n = 0
and there is only one unique
x
.
## S3 method for class 'Date' pretty(x, n = 5, min.n = n %/% 2, sep = " ", ...) ## S3 method for class 'POSIXt' pretty(x, n = 5, min.n = n %/% 2, sep = " ", ...)
## S3 method for class 'Date' pretty(x, n = 5, min.n = n %/% 2, sep = " ", ...) ## S3 method for class 'POSIXt' pretty(x, n = 5, min.n = n %/% 2, sep = " ", ...)
x |
an object of class |
n |
integer giving the desired number of intervals. |
min.n |
nonnegative integer giving the minimal number of intervals. |
sep |
character string, serving as a separator for certain formats (e.g., between month and year). |
... |
further arguments for compatibility with the generic, ignored. |
A vector (of the suitable class) of locations, with attribute
"labels"
giving corresponding formatted character labels and attribute
"format"
giving the format specification that was used.
pretty
for the default method.
pretty(Sys.Date()) pretty(Sys.time(), n = 10) pretty(as.Date("2000-03-01")) # R 1.0.0 came in a leap year ## time ranges in diverse scales:% also in ../../../../tests/reg-tests-1c.R steps <- stats::setNames(, c("10 secs", "1 min", "5 mins", "30 mins", "6 hours", "12 hours", "1 DSTday", "2 weeks", "1 month", "6 months", "1 year", "10 years", "50 years", "1000 years")) x <- as.POSIXct("2002-02-02 02:02") lapply(steps, function(s) { at <- pretty(seq(x, by = s, length.out = 2), n = 5) attr(at, "labels") })
pretty(Sys.Date()) pretty(Sys.time(), n = 10) pretty(as.Date("2000-03-01")) # R 1.0.0 came in a leap year ## time ranges in diverse scales:% also in ../../../../tests/reg-tests-1c.R steps <- stats::setNames(, c("10 secs", "1 min", "5 mins", "30 mins", "6 hours", "12 hours", "1 DSTday", "2 weeks", "1 month", "6 months", "1 year", "10 years", "50 years", "1000 years")) x <- as.POSIXct("2002-02-02 02:02") lapply(steps, function(s) { at <- pretty(seq(x, by = s, length.out = 2), n = 5) attr(at, "labels") })
The auxiliary function ps.options
can be used to set or view
(if called without arguments) the default values for some of the
arguments to postscript
.
ps.options
needs to be called before calling postscript
,
and the default values it sets can be overridden by supplying
arguments to postscript
.
ps.options(..., reset = FALSE, override.check = FALSE) setEPS(...) setPS(...)
ps.options(..., reset = FALSE, override.check = FALSE) setEPS(...) setPS(...)
... |
arguments |
reset |
logical: should the defaults be reset to their ‘factory-fresh’ values? |
override.check |
logical argument passed to
|
If both reset = TRUE
and ...
are supplied the defaults
are first reset to the ‘factory-fresh’ values and then the new
values are applied.
For backwards compatibility argument append
is accepted but
ignored with a warning.
setEPS
and setPS
are wrappers to set defaults
appropriate for figures for inclusion in documents (the default size
is 7 inches square unless width
or height
is supplied)
and for spooling to a PostScript printer respectively. For historical
reasons the latter is the ultimate default.
A named list of all the previous defaults. If ...
or
reset = TRUE
is supplied the result has the visibility flag
turned off.
ps.options(bg = "pink") utils::str(ps.options()) ### ---- error checking of arguments: ---- ps.options(width = 0:12, onefile = 0, bg = pi) # override the check for 'width', but not 'bg': ps.options(width = 0:12, bg = pi, override.check = c(TRUE,FALSE)) utils::str(ps.options()) ps.options(reset = TRUE) # back to factory-fresh
ps.options(bg = "pink") utils::str(ps.options()) ### ---- error checking of arguments: ---- ps.options(width = 0:12, onefile = 0, bg = pi) # override the check for 'width', but not 'bg': ps.options(width = 0:12, bg = pi, override.check = c(TRUE,FALSE)) utils::str(ps.options()) ps.options(reset = TRUE) # back to factory-fresh
quartz
starts a graphics device driver for the macOS system.
It supports plotting both to the screen (the default) and to various
graphics file formats.
quartz(title, width, height, pointsize, family, antialias, type, file = NULL, bg, canvas, dpi) quartz.options(..., reset = FALSE) quartz.save(file, type = "png", device = dev.cur(), dpi = 100, ...)
quartz(title, width, height, pointsize, family, antialias, type, file = NULL, bg, canvas, dpi) quartz.options(..., reset = FALSE) quartz.save(file, type = "png", device = dev.cur(), dpi = 100, ...)
title |
title for the Quartz window (applies to on-screen output
only), default |
width |
the width of the plotting area in inches. Default |
height |
the height of the plotting area in inches. Default |
pointsize |
the default pointsize to be used. Default |
family |
this is the family name of the font
that will be used by the device. Default |
antialias |
whether to use antialiasing. Default |
type |
the type of output to use. See ‘Details’ for
more information. Default |
file |
an optional target for the graphics device. The default,
|
bg |
the initial background colour to use for the device. Default
|
canvas |
canvas colour to use for an on-screen device. Default
|
dpi |
resolution of the output. The default ( |
... |
Any of the arguments to |
reset |
logical: should the defaults be reset to their defaults? |
device |
device number to copy from. |
The defaults for all but one of the arguments of quartz
are set
by quartz.options
: the ‘Arguments’ section gives the
‘factory-fresh’ defaults.
The Quartz graphics device supports a variety of output types.
On-screen output types are ""
or "native"
or
"Cocoa"
. Off-screen output types produce output files and
utilize the file
argument. type = "pdf"
gives PDF
output. The following bitmap formats may be supported (depending on
the OS version): "png"
, "jpeg"
, "jpg"
,
"jpeg2000"
, "tif"
, "tiff"
, "gif"
,
"psd"
(Adobe Photoshop), "bmp"
(Windows bitmap),
"sgi"
and "pict"
.
The file
argument is used for off-screen drawing. The actual
file is only created when the device is closed (e.g., using
dev.off()
). For the bitmap devices, the page number is
substituted if a C integer format is included in the character string,
e.g. Rplot%03d.png
. (Depending on the platform,
the result should be less than
PATH_MAX
characters long, and may be truncated if not. See
pdf
for further details.) If a file
argument is not supplied, the default is Rplots.pdf
or
Rplot%03d.type
. Tilde expansion
(see path.expand
) is done.
If a device-independent R graphics font family is specified (e.g.,
via par(family =)
in the graphics package), the Quartz device
makes use of the Quartz font database (see quartzFonts
) to
convert the R graphics font family to a Quartz-specific font family
description. The default conversions are (MonoType TrueType versions
of) Helvetica
for sans
, Times-Roman
for
serif
and Courier
for mono
.
On-screen devices are launched with a semi-transparent canvas. Once a
new plot is created, the canvas is first painted with the
canvas
colour and then the current background colour (which can
be transparent or semi-transparent). Off-screen devices have no
canvas colour, and so start with a transparent background where
possible (e.g., type = "png"
and type = "tiff"
) –
otherwise it appears that a solid white canvas is assumed in the
Quartz code. PNG and TIFF files are saved with a dark grey matte
which will show up in some viewers, including Preview
.
title
can be used for on-screen output. It must be a single
character string with an optional integer printf-style format that
will be substituted by the device number. It is also optionally used
(without a format) to give a title to a PDF file.
Calling quartz()
sets .Device
to "quartz"
for on-screen devices and to "quartz_off_screen"
otherwise.
The font family chosen needs to cover the characters to be used:
characters not in the font are rendered as empty oblongs. For
non-Western-European languages something other than the default of
"Arial"
is likely to be needed—one choice for Chinese is
"MingLiU"
.
quartz.save
is a modified version of dev.copy2pdf
to copy the plot from the current screen device to a quartz
device, by default to a PNG file.
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is 7 inches square.
Font sizes are in big points.
The default font family is Arial.
Line widths are a multiple of 1/96 inch with no minimum set by R.
Circle radii are real-valued with no minimum set by R.
Colours are specified as sRGB.
For a long time the default font family was documented as
"Helvetica"
after it had been changed to "Arial"
to work
around a deficiency in macOS 10.4. It may be changed back in future.
A fairly common Mac problem is no text appearing on plots due to
corrupted or duplicated fonts on your system. You may be able to
confirm this by using another font family,
e.g. family = "serif"
.
Open the Font Book
application (in Applications
) and
check the fonts that you are using.
png
for way to access the bitmap types of this device
via R's standard bitmap devices.
## Not run: ## Only on a Mac, ## put something like this is your .Rprofile to customize the defaults setHook(packageEvent("grDevices", "onLoad"), function(...) grDevices::quartz.options(width = 8, height = 6, pointsize = 10)) ## End(Not run)
## Not run: ## Only on a Mac, ## put something like this is your .Rprofile to customize the defaults setHook(packageEvent("grDevices", "onLoad"), function(...) grDevices::quartz.options(width = 8, height = 6, pointsize = 10)) ## End(Not run)
These functions handle the translation of a device-independent R graphics
font family name to a quartz
font description.
They are only available on Unix-alikes, i.e, not on Windows, and typically used on the Mac.
quartzFont(family) quartzFonts(...)
quartzFont(family) quartzFonts(...)
family |
a character vector containing the four PostScript font names for plain, bold, italic, and bold italic versions of a font family. |
... |
either character strings naming mappings to display, or new (named) mappings to define. |
A quartz device is created with a default font (see
the documentation for quartz
), but it is also possible
to specify a font family when drawing to the device
(for example, see the documentation for gpar
in the
grid package).
The font family sent to the device is a simple string name, which must be mapped to something more specific to quartz fonts. A list of mappings is maintained and can be modified by the user.
The quartzFonts
function can be used to list existing
mappings and to define new mappings. The quartzFont
function can be used to create a new mapping.
Default mappings are provided for three device-independent font family
names: "sans"
for a sans-serif font, "serif"
for a serif
font and "mono"
for a monospaced font.
quartz
for the default Mac graphics device.
if(.Platform$OS.type == "unix") { # includes macOS utils::str( quartzFonts() ) # a list(serif = .., sans = .., mono = ..) quartzFonts("mono") # the list(mono = ..) sublist of quartzFonts() ## Not run: ## for East Asian locales you can use something like quartzFonts(sans = quartzFont(rep("AppleGothic", 4)), serif = quartzFont(rep("AppleMyungjp", 4))) ## since the default fonts may well not have the glyphs needed ## End(Not run) }
if(.Platform$OS.type == "unix") { # includes macOS utils::str( quartzFonts() ) # a list(serif = .., sans = .., mono = ..) quartzFonts("mono") # the list(mono = ..) sublist of quartzFonts() ## Not run: ## for East Asian locales you can use something like quartzFonts(sans = quartzFont(rep("AppleGothic", 4)), serif = quartzFont(rep("AppleMyungjp", 4))) ## since the default fonts may well not have the glyphs needed ## End(Not run) }
Records arbitrary code on the graphics engine display list. Useful for encapsulating calculations with graphical output that depends on the calculations. Intended only for expert use.
recordGraphics(expr, list, env)
recordGraphics(expr, list, env)
expr |
object of mode |
list |
a list defining the environment in which |
env |
an |
The code in expr
is evaluated in an environment constructed
from list
, with env
as the parent of that environment.
All three arguments are saved on the graphics engine display list so that on a device resize or copying between devices, the original evaluation environment can be recreated and the code can be re-evaluated to reproduce the graphical output.
The value from evaluating expr
.
This function is not intended for general use. Incorrect or improper use of this function could lead to unintended and/or undesirable results.
An example of acceptable use is querying the current state of a graphics device or graphics system setting and then calling a graphics function.
An example of improper use would be calling the assign
function
to performing assignments in the global environment.
require(graphics) plot(1:10) # This rectangle remains 1inch wide when the device is resized recordGraphics( { rect(4, 2, 4 + diff(par("usr")[1:2])/par("pin")[1], 3) }, list(), getNamespace("graphics"))
require(graphics) plot(1:10) # This rectangle remains 1inch wide when the device is resized recordGraphics( { rect(4, 2, 4 + diff(par("usr")[1:2])/par("pin")[1], 3) }, list(), getNamespace("graphics"))
Functions to save the current plot in an R variable, and to replay it.
recordPlot(load=NULL, attach=NULL) replayPlot(x, reloadPkgs=FALSE)
recordPlot(load=NULL, attach=NULL) replayPlot(x, reloadPkgs=FALSE)
load |
If not |
attach |
If not |
x |
A saved plot. |
reloadPkgs |
A logical indicating whether to reload and/or reattach any packages that were saved as part of the recorded plot. |
These functions record and replay the display list of the current
graphics device. The returned object is of class
"recordedplot"
, and replayPlot
acts as a print
method for that class.
The returned object is stored as a pairlist, but the usual methods for
examining R objects such as deparse
and
str
are liable to mislead.
recordPlot
returns an object of class "recordedplot"
.
replayPlot
has no return value.
The format of recorded plots may change between R versions, so recorded plots should not be used as a permanent storage format for R plots.
As of R 3.3.0, it is possible (again)
to replay a plot from another R session using, for example,
saveRDS
and readRDS
.
It is even possible to replay a plot from another R version,
however, this will produce warnings, may produce errors,
or something worse.
Replay of a recorded plot may not produce the correct result
(or may just fail) if the display list contains a call to
recordGraphics
which in turn contains an expression
that calls code from a non-base package other than graphics
or grid. The most well-known example of this is a plot
drawn with the package ggplot2. One solution is to load
the relevant package(s) before replaying the recorded plot.
The load
and attach
arguments to recordPlot
can be used to automate this - any packages named in load
will be reloaded, via loadNamespace
, and any packages
named in attach
will be reattached, via library
,
as long as reloadPkgs
is TRUE
in the call to
replayPlot
. This is only relevant when attempting to
replay in one R session a plot that was recorded in a different R session.
Murrell, P., Ooms, J., Allaire, J.J. (2015), "Recording and Replaying the Graphics Engine Display List", https://stattech.wordpress.fos.auckland.ac.nz/2015/12/21/2015-07-recording-and-replaying-the-graphics-engine-display-list/
The display list can be turned on and off using dev.control
.
Initially recording is on for screen devices, and off for print devices.
This function creates colors corresponding to the given
intensities (between 0 and max
) of the red, green and blue
primaries. The colour specification refers to the
standard sRGB colorspace (IEC standard 61966).
An alpha transparency value can also be specified (as an opacity, so
0
means fully transparent and max
means opaque). If
alpha
is not specified, an opaque colour is generated.
The names
argument may be used to provide names for the
colors.
The values returned by these functions can be used with a
col=
specification in graphics functions or in par
.
rgb(red, green, blue, alpha, names = NULL, maxColorValue = 1)
rgb(red, green, blue, alpha, names = NULL, maxColorValue = 1)
red , blue , green , alpha
|
numeric vectors with values in |
names |
character vector. The names for the resulting vector. |
maxColorValue |
number giving the maximum of the color values range, see above. |
The colors may be specified by passing a matrix or data frame as argument
red
, and leaving blue
and green
missing.
In this case the first three columns of red
are taken to be
the red
, green
and blue
values.
Semi-transparent colors (0 < alpha < 1
) are supported only on
some devices: at the time of writing on the pdf
,
windows
, quartz
and X11(type = "cairo")
devices and
associated bitmap devices (jpeg
, png
, bmp
,
tiff
and bitmap
). They are supported by several
third-party devices such as those in packages Cairo,
cairoDevice and JavaGD. Only some of these
devices support semi-transparent backgrounds.
Most other graphics devices plot semi-transparent colors as fully transparent, usually with a warning when first encountered.
NA
values are not allowed for any of red
, blue
,
green
or alpha
.
A character vector with elements of 7 or 9 characters,
beginning with "#"
followed by the red,
blue, green and optionally alpha values in hexadecimal (after
rescaling to 0 ... 255
). The optional alpha values range
from 0
(fully transparent) to 255
(opaque).
R does not use ‘premultiplied alpha’.
col2rgb
for translating R colors to RGB vectors;
rainbow
, hsv
, hcl
,
gray
.
rgb(0, 1, 0) rgb((0:15)/15, green = 0, blue = 0, names = paste("red", 0:15, sep = ".")) rgb(0, 0:12, 0, maxColorValue = 255) # integer input ramp <- colorRamp(c("red", "white")) rgb( ramp(seq(0, 1, length.out = 5)), maxColorValue = 255)
rgb(0, 1, 0) rgb((0:15)/15, green = 0, blue = 0, names = paste("red", 0:15, sep = ".")) rgb(0, 0:12, 0, maxColorValue = 255) # integer input ramp <- colorRamp(c("red", "white")) rgb( ramp(seq(0, 1, length.out = 5)), maxColorValue = 255)
rgb2hsv
transforms colors
from RGB space (red/green/blue)
into HSV space (hue/saturation/value).
rgb2hsv(r, g = NULL, b = NULL, maxColorValue = 255)
rgb2hsv(r, g = NULL, b = NULL, maxColorValue = 255)
r |
vector of ‘red’ values in |
g |
vector of ‘green’ values, or |
b |
vector of ‘blue’ values, or |
maxColorValue |
number giving the maximum of the RGB color values
range. The default |
Value (brightness) gives the amount of light in the color.
Hue describes the dominant wavelength.
Saturation is the amount of Hue mixed into the color.
An HSV colorspace is relative to an RGB colorspace, which in R is sRGB, which has an implicit gamma correction.
A matrix with a column for each color. The three rows of the matrix
indicate hue, saturation and value and are named "h"
,
"s"
, and "v"
accordingly.
R interface by Wolfram Fischer [email protected];
C code mainly by Nicholas Lewin-Koh [email protected].
## These (saturated, bright ones) only differ by hue (rc <- col2rgb(c("red", "yellow","green","cyan", "blue", "magenta"))) (hc <- rgb2hsv(rc)) 6 * hc["h",] # the hues are equispaced (rgb3 <- floor(256 * matrix(stats::runif(3*12), 3, 12))) (hsv3 <- rgb2hsv(rgb3)) ## Consistency : stopifnot(rgb3 == col2rgb(hsv(h = hsv3[1,], s = hsv3[2,], v = hsv3[3,])), all.equal(hsv3, rgb2hsv(rgb3/255, maxColorValue = 1))) ## A (simplified) pure R version -- originally by Wolfram Fischer -- ## showing the exact algorithm: rgb2hsvR <- function(rgb, gamma = 1, maxColorValue = 255) { if(!is.numeric(rgb)) stop("rgb matrix must be numeric") d <- dim(rgb) if(d[1] != 3) stop("rgb matrix must have 3 rows") n <- d[2] if(n == 0) return(cbind(c(h = 1, s = 1, v = 1))[,0]) rgb <- rgb/maxColorValue if(gamma != 1) rgb <- rgb ^ (1/gamma) ## get the max and min v <- apply( rgb, 2, max) s <- apply( rgb, 2, min) D <- v - s # range ## set hue to zero for undefined values (gray has no hue) h <- numeric(n) notgray <- ( s != v ) ## blue hue idx <- (v == rgb[3,] & notgray ) if (any (idx)) h[idx] <- 2/3 + 1/6 * (rgb[1,idx] - rgb[2,idx]) / D[idx] ## green hue idx <- (v == rgb[2,] & notgray ) if (any (idx)) h[idx] <- 1/3 + 1/6 * (rgb[3,idx] - rgb[1,idx]) / D[idx] ## red hue idx <- (v == rgb[1,] & notgray ) if (any (idx)) h[idx] <- 1/6 * (rgb[2,idx] - rgb[3,idx]) / D[idx] ## correct for negative red idx <- (h < 0) h[idx] <- 1+h[idx] ## set the saturation s[! notgray] <- 0; s[notgray] <- 1 - s[notgray] / v[notgray] rbind( h = h, s = s, v = v ) } ## confirm the equivalence: all.equal(rgb2hsv (rgb3), rgb2hsvR(rgb3), tolerance = 1e-14) # TRUE
## These (saturated, bright ones) only differ by hue (rc <- col2rgb(c("red", "yellow","green","cyan", "blue", "magenta"))) (hc <- rgb2hsv(rc)) 6 * hc["h",] # the hues are equispaced (rgb3 <- floor(256 * matrix(stats::runif(3*12), 3, 12))) (hsv3 <- rgb2hsv(rgb3)) ## Consistency : stopifnot(rgb3 == col2rgb(hsv(h = hsv3[1,], s = hsv3[2,], v = hsv3[3,])), all.equal(hsv3, rgb2hsv(rgb3/255, maxColorValue = 1))) ## A (simplified) pure R version -- originally by Wolfram Fischer -- ## showing the exact algorithm: rgb2hsvR <- function(rgb, gamma = 1, maxColorValue = 255) { if(!is.numeric(rgb)) stop("rgb matrix must be numeric") d <- dim(rgb) if(d[1] != 3) stop("rgb matrix must have 3 rows") n <- d[2] if(n == 0) return(cbind(c(h = 1, s = 1, v = 1))[,0]) rgb <- rgb/maxColorValue if(gamma != 1) rgb <- rgb ^ (1/gamma) ## get the max and min v <- apply( rgb, 2, max) s <- apply( rgb, 2, min) D <- v - s # range ## set hue to zero for undefined values (gray has no hue) h <- numeric(n) notgray <- ( s != v ) ## blue hue idx <- (v == rgb[3,] & notgray ) if (any (idx)) h[idx] <- 2/3 + 1/6 * (rgb[1,idx] - rgb[2,idx]) / D[idx] ## green hue idx <- (v == rgb[2,] & notgray ) if (any (idx)) h[idx] <- 1/3 + 1/6 * (rgb[3,idx] - rgb[1,idx]) / D[idx] ## red hue idx <- (v == rgb[1,] & notgray ) if (any (idx)) h[idx] <- 1/6 * (rgb[2,idx] - rgb[3,idx]) / D[idx] ## correct for negative red idx <- (h < 0) h[idx] <- 1+h[idx] ## set the saturation s[! notgray] <- 0; s[notgray] <- 1 - s[notgray] / v[notgray] rbind( h = h, s = s, v = v ) } ## confirm the equivalence: all.equal(rgb2hsv (rgb3), rgb2hsvR(rgb3), tolerance = 1e-14) # TRUE
Save the current page of a cairo X11()
device to a file.
savePlot(filename = paste0("Rplot.", type), type = c("png", "jpeg", "tiff", "bmp"), device = dev.cur())
savePlot(filename = paste0("Rplot.", type), type = c("png", "jpeg", "tiff", "bmp"), device = dev.cur())
filename |
filename to save to. |
type |
file type. |
device |
the device to save from. |
Only cairo-based X11
devices are supported.
This works by copying the image surface to a file. For PNG will always be a 24-bit per pixel PNG ‘DirectClass’ file, for JPEG the quality is 75% and for TIFF there is no compression.
For devices with buffering this copies the buffer's image surface, so
works even if dev.hold
has been called.
The plot is saved after rendering onto the canvas (default opaque
white), so for the default bg = "transparent"
the effective
background colour is the canvas colour.
Invisible NULL
.
There is a similar function of the same name but more types for
windows
devices on Windows: that has an additional argument
restoreConsole
which is only supported on Windows.
recordPlot()
which is device independent. Further,
X11
, dev.copy
, dev.print
Projection of 3-dimensional to 2-dimensional points using a 4x4
viewing transformation matrix. Mainly for adding to
perspective plots such as persp
.
trans3d(x, y, z, pmat, continuous = FALSE, verbose = TRUE)
trans3d(x, y, z, pmat, continuous = FALSE, verbose = TRUE)
x , y , z
|
numeric vectors of equal length, specifying points in 3D space. |
pmat |
a |
continuous |
logical flag specifying if the transformation should
check if the transformed points are continuous in the sense that they
do not jump over |
verbose |
only for |
a list with two components
x , y
|
the projected 2d coordinates of the 3d input |
## See help(persp) {after attaching the 'graphics' package} ## ----------- ## Example for 'continuous = TRUE' (vs default): require(graphics) x <- -10:10/10 # [-1, 1] y <- -16:16/16 # [-1, 1] ==> z = fxy := outer(x,y) is also in [-1,1] p <- persp(x, y, fxy <- outer(x,y), phi = 20, theta = 15, r = 3, ltheta = -75, shade = 0.8, col = "green3", ticktype = "detailed") ## 5 axis-parallel auxiliary lines in x-y and y-z planes : lines(trans3d(-.5 , y=-1:1, z=min(fxy), pmat=p), lty=2) lines(trans3d( 0 , y=-1:1, z=min(fxy), pmat=p), lty=2) lines(trans3d(-1:1, y= -.7, z=min(fxy), pmat=p), lty=2) lines(trans3d( -1, y= -.7, z=c(-1,1) , pmat=p), lty=2) lines(trans3d( -1, y=-1:1, z= -.5 , pmat=p), lty=2) ## 2 pillars to carry the horizontals below: lines(trans3d(-.5 , y= -.7, z=c(-1,-.5), pmat=p), lwd=1.5, col="gray10") lines(trans3d( 0 , y= -.7, z=c(-1,-.5), pmat=p), lwd=1.5, col="gray10") ## now some "horizontal rays" (going from center to very left or very right): doHor <- function(x1, x2, z, CNT=FALSE, ...) lines(trans3d(x=seq(x1, x2, by=0.5), y= -0.7, z = z, pmat = p, continuous = CNT), lwd = 3, type="b", xpd=NA, ...) doHor(-10, 0, z = -0.5, col = 2) # x in [-10, 0] -- to the very left : fine doHor(-.5, 2, z = -0.52,col = 4) # x in [-0.5, 2] only {to the right} --> all fine ## but now, x in [-0.5, 20] -- "too far" ==> "wrap around" problem (without 'continuous=TRUE'): doHor(-.5, 20, z = -0.58, col = "steelblue", lty=2) ## but it is fixed with continuous = CNT = TRUE: doHor(-.5, 20, z = -0.55, CNT=TRUE, col = "skyblue")
## See help(persp) {after attaching the 'graphics' package} ## ----------- ## Example for 'continuous = TRUE' (vs default): require(graphics) x <- -10:10/10 # [-1, 1] y <- -16:16/16 # [-1, 1] ==> z = fxy := outer(x,y) is also in [-1,1] p <- persp(x, y, fxy <- outer(x,y), phi = 20, theta = 15, r = 3, ltheta = -75, shade = 0.8, col = "green3", ticktype = "detailed") ## 5 axis-parallel auxiliary lines in x-y and y-z planes : lines(trans3d(-.5 , y=-1:1, z=min(fxy), pmat=p), lty=2) lines(trans3d( 0 , y=-1:1, z=min(fxy), pmat=p), lty=2) lines(trans3d(-1:1, y= -.7, z=min(fxy), pmat=p), lty=2) lines(trans3d( -1, y= -.7, z=c(-1,1) , pmat=p), lty=2) lines(trans3d( -1, y=-1:1, z= -.5 , pmat=p), lty=2) ## 2 pillars to carry the horizontals below: lines(trans3d(-.5 , y= -.7, z=c(-1,-.5), pmat=p), lwd=1.5, col="gray10") lines(trans3d( 0 , y= -.7, z=c(-1,-.5), pmat=p), lwd=1.5, col="gray10") ## now some "horizontal rays" (going from center to very left or very right): doHor <- function(x1, x2, z, CNT=FALSE, ...) lines(trans3d(x=seq(x1, x2, by=0.5), y= -0.7, z = z, pmat = p, continuous = CNT), lwd = 3, type="b", xpd=NA, ...) doHor(-10, 0, z = -0.5, col = 2) # x in [-10, 0] -- to the very left : fine doHor(-.5, 2, z = -0.52,col = 4) # x in [-0.5, 2] only {to the right} --> all fine ## but now, x in [-0.5, 20] -- "too far" ==> "wrap around" problem (without 'continuous=TRUE'): doHor(-.5, 20, z = -0.58, col = "steelblue", lty=2) ## but it is fixed with continuous = CNT = TRUE: doHor(-.5, 20, z = -0.55, CNT=TRUE, col = "skyblue")
These functions are used to define the translation of a R graphics
font family name to Type 1 or CID font descriptions, used by
the pdf
and postscript
graphics devices.
Type1Font(family, metrics, encoding = "default") CIDFont(family, cmap, cmapEncoding, pdfresource = "")
Type1Font(family, metrics, encoding = "default") CIDFont(family, cmap, cmapEncoding, pdfresource = "")
family |
a character string giving the name to be used internally
for a Type 1 or CID-keyed font family. This needs to uniquely
identify each family, so if you modify a family which is in use
(see |
metrics |
a character vector of four or five strings giving paths to the afm (Adobe Font Metric) files for the font. |
cmap |
the name of a CMap file for a CID-keyed font. |
encoding |
for |
cmapEncoding |
The name of a character encoding to be used with the named CMap file: strings will be translated to this encoding when written to the file. |
pdfresource |
A chunk of PDF code; only required for using
a CID-keyed font on |
For Type1Fonts
, if four ‘.afm’ files are supplied the
fifth is taken to be "Symbol.afm"
. Relative paths are taken
relative to the directory ‘R_HOME/library/grDevices/afm’.
The fifth (symbol) font must be in AdobeSym
encoding.
However, the glyphs in the first four fonts are referenced by name
and any encoding given within the ‘.afm’ files is not used.
The ‘.afm’ files may be compressed with (or without) final extension ‘.gz’: the files which ship with R are installed as compressed files with this extension.
Glyphs in CID-keyed fonts are accessed by ID (number) and not by name.
The CMap file maps encoded strings (usually in a MBCS) to IDs, so
cmap
and cmapEncoding
specifications must match. There
are no real bold or italic versions of CID fonts (bold/italic were
very rarely used in traditional East Asian topography), and for the
pdf
device all four font faces will be identical.
However, for the postscript
device, bold and italic (and
bold italic) are emulated.
CID-keyed fonts are intended only for use for the glyphs of East Asian
languages, which are all monospaced and are all treated as filling the
same bounding box. (Thus plotmath
will work with such
characters, but the spacing will be less carefully controlled than
with Western glyphs.) The CID-keyed fonts do contain other
characters, including a Latin alphabet: non-East-Asian glyphs are
regarded as monospaced with half the width of East Asian glyphs. This
is often the case, but sometimes Latin glyphs designed for
proportional spacing are used (and may look odd). We strongly
recommend that CID-keyed fonts are only used for East Asian
glyphs.
A list of class "Type1Font"
or "CIDFont"
.
pdf
, postscript
, pdfFonts
and
postscriptFonts
.
## This duplicates "ComputerModernItalic". CMitalic <- Type1Font("ComputerModern2", c("CM_regular_10.afm", "CM_boldx_10.afm", "cmti10.afm", "cmbxti10.afm", "CM_symbol_10.afm"), encoding = "TeXtext.enc") ## Not run: ## This could be used by postscript(family = CMitalic) ## or postscriptFonts(CMitalic = CMitalic) # once in a session postscript(family = "CMitalic", encoding = "TeXtext.enc") ## End(Not run)
## This duplicates "ComputerModernItalic". CMitalic <- Type1Font("ComputerModern2", c("CM_regular_10.afm", "CM_boldx_10.afm", "cmti10.afm", "cmbxti10.afm", "CM_symbol_10.afm"), encoding = "TeXtext.enc") ## Not run: ## This could be used by postscript(family = CMitalic) ## or postscriptFonts(CMitalic = CMitalic) # once in a session postscript(family = "CMitalic", encoding = "TeXtext.enc") ## End(Not run)
Available only on Windows.
A graphics device is opened. For windows
, win.graph
,
x11
and X11
this is a window on the current
Windows display: the multiple names are for compatibility with other
systems. win.metafile
prints to a file and win.print
to
the Windows print system.
windows(width, height, pointsize, record, rescale, xpinch, ypinch, bg, canvas, gamma, xpos, ypos, buffered, title, restoreConsole, clickToConfirm, fillOddEven, family, antialias) win.graph(width, height, pointsize) win.metafile(filename = "", width = 7, height = 7, pointsize = 12, family, restoreConsole = TRUE, xpinch = NA_real_, ypinch = NA_real_) win.print(width = 7, height = 7, pointsize = 12, printer = "", family, antialias, restoreConsole = TRUE)
windows(width, height, pointsize, record, rescale, xpinch, ypinch, bg, canvas, gamma, xpos, ypos, buffered, title, restoreConsole, clickToConfirm, fillOddEven, family, antialias) win.graph(width, height, pointsize) win.metafile(filename = "", width = 7, height = 7, pointsize = 12, family, restoreConsole = TRUE, xpinch = NA_real_, ypinch = NA_real_) win.print(width = 7, height = 7, pointsize = 12, printer = "", family, antialias, restoreConsole = TRUE)
width , height
|
the (nominal) width and height of the canvas of
the plotting window in inches. Default |
pointsize |
the default pointsize of plotted text, interpreted as
big points (1/72 inch). Values are rounded to the nearest integer:
values less than or equal to zero are reset to |
record |
logical: sets the initial state of the flag for
recording plots. Default |
rescale |
character, one of |
xpinch , ypinch
|
double. Pixels per inch, horizontally and
vertically. Default |
bg |
color. The initial background color. Default
|
canvas |
color. The color of the canvas which is visible
when the background color is transparent. Should be a solid color
(and any alpha value will be ignored). Default |
gamma |
gamma correction fudge factor. Colours in R are sRGB; if your monitor does not conform to sRGB, you might be able to improve things by tweaking this parameter to apply additional gamma correction to the RGB channels. By default 1 (no additional gamma correction). |
xpos , ypos
|
integer. Position of the top left of the window, in
pixels. Negative values are taken from the opposite edge of the
monitor. Missing values (the default) mean take the default from the
‘Rconsole’ file, which in turn defaults to
|
buffered |
logical. Should the screen output be double-buffered?
Default |
title |
character string, up to 100 bytes. With the default
|
filename |
the name of the output file: it will be an enhanced
Windows metafile, usually given extension ‘.emf’ or
‘.wmf’. Up to 511 characters are allowed. The page number is
substituted if an integer format is included in the character
string (see |
printer |
The name of a printer as known to Windows. The default causes a dialog box to come up for the user to choose a printer. |
restoreConsole |
logical: see the ‘Details’ below. Defaults to
|
clickToConfirm |
logical: if true confirmation of a new frame
will be by clicking on the device rather than answering a problem in
the console. Default |
fillOddEven |
logical controlling the polygon fill mode: see
|
family |
A length-one character vector specifying the default font family. See section ‘Fonts’. |
antialias |
A length-one character vector, requesting control
over font antialiasing. This is partially matched to
|
All these devices are implemented as variants of the same device.
All arguments of windows
have defaults set by
windows.options
: the defaults given in the arguments section
are the defaults for the defaults. These defaults also apply to the
internal values of gamma
, xpinch
, ypinch
,
buffered
, restoreConsole
and antialias
for
win.graph
, x11
and X11
.
The size of a window is computed from information provided about the
display: it depends on the system being configured accurately.
By default a screen device asks Windows for the number of pixels per
inch. This can be overridden (it is often wrong) by specifying
xpinch
and ypinch
, most conveniently via
windows.options
. For example, a 13.3 inch 1280x800
screen (a typical laptop display) was reported as 96 dpi even though
it is physically about 114 dpi. These arguments may also be useful
to match the scale of output to the size of a metafile (which otherwise
depends on the system being configured accurately).
The different colours need to be distinguished carefully. Areas
outside the device region are coloured in the Windows application background
colour. The device region is coloured in the canvas colour. This is
over-painted by the background colour of a plot when a new page is
called for, but that background colour can be transparent (and is by
default). One difference between setting the canvas colour and the
background colour is that when a plot is saved the background
colour is copied but the canvas colour is not. The argument bg
sets the initial value of par("bg")
in base graphics and
gpar("fill")
in grid graphics
Recorded plot histories are of class "SavedPlots"
. They have a
print
method, and a subset method. As the individual plots are
of class "recordedplot"
they can be replayed by printing them:
see recordPlot
. The active plot history is stored in
variable .SavedPlots
in the workspace.
When a screen device is double-buffered (the default) the
screen is updated 100ms after last plotting call or every 500ms during
continuous plotting. These times can be altered by setting
options("windowsTimeout")
to a vector of two integers before
opening the device.
Line widths as controlled by par(lwd =)
are in multiples of
1/96inch. Multiples less than 1 are allowed, down to one pixel width.
For win.metafile
only one plot is allowed per file, and Windows
seems to disallow reusing the file. So the only way to allow
multiple plots is to use a parametrized filename
as in the
example. If the filename
is omitted (or specified as
""
), the output is copied to the clipboard when the device is
closed.
The restoreConsole
argument is a temporary fix for a problem
in the current implementation of several Windows graphics devices,
and is likely to be removed in an upcoming release. If set to
FALSE
, the console will not receive the focus after the new
device is opened.
There is support for semi-transparent colours of lines, fills and text on the screen devices. These work for saving (from the ‘File’ menu) to PDF, PNG, BMP, JPEG and TIFF, but will be ignored if saving to Metafile and PostScript. Limitations in the underlying Windows API mean that a semi-transparent object must be contained strictly within the device region (allowing for line widths and joins).
A plot device is opened: nothing is returned to the R interpreter.
If a screen device is re-sized, the default behaviour ("R"
) is
to redraw the plot(s) as if the new size had been specified
originally. Using "fit"
will rescale the existing plot(s) to
fit the new device region, preserving the aspect ratio. Using
"fixed"
will leave the plot size unchanged, adding scrollbars
if part of the plot is obscured.
A graphics window will never be created at more than 85% of
the screen width or height, but can be resized to a larger size.
For the first two rescale
options the width and height are
rescaled proportionally if necessary, and if rescale = "fit"
the plot(s) are rescaled accordingly. If rescale = "fixed"
the initially displayed portion is selected within these constraints,
separately for width and height. In MDI mode,
the limit is 85% of the MDI client region.
Using strwidth
or strheight
after a window
has been rescaled (when using "fit"
) gives dimensions in the
original units, but only approximately as they are derived from the
metrics of the rescaled fonts (which are in integer sizes)
The displayed region may be bigger than the ‘paper’ size, and
area(s) outside the ‘paper’ are coloured in the Windows
application background colour. Graphics parameters such as
"din"
refer to the scaled plot if rescaling is in effect.
The fonts used for text drawn in a Windows device may be controlled in
two ways. The file R_HOME\etc\Rdevga
can be used to
specify mappings for par(font =)
(or the grid equivalent).
Alternatively, a font family can be specified by a non-empty
family
argument (or by e.g. par(family =)
in the graphics
package) and this will be used for fonts 1:4 via the Windows font
database (see windowsFonts
).
How the fonts look depends on the antialiasing settings, both through
the antialias
argument and the machine settings. These are
hints to Windows GDI that may not be able to be followed, but
antialias = "none"
should ensure that no antialiasing is used.
For a screen device the default depends on the machine settings: it
will be "cleartype"
if that has been enabled. Note that the
greyscale antialiasing that is used only for small fonts (below about
9 pixels, around 7 points on a typical display).
When accessing a system through Remote Desktop, both the Remote Desktop settings and the user's local account settings are relevant to whether antialiasing is used.
Some fonts are intended only to be used with ClearType antialiasing,
for example the Meiryo
Japanese font.
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is 7 inches square, although this is often incorrectly implemented by Windows: see ‘Details’.
Font sizes are in big points.
The default font family is Arial.
Line widths are as a multiple of 1/96 inch, with a minimum of one pixel.
The minimum radius of a circle is 1 pixel.
pch = "."
with cex = 1
corresponds to a rectangle of sides
the larger of one pixel and 0.01 inch.
Colours are interpreted via the unprofiled colour mapping of the graphics card – this is assumed to conform to sRGB.
x11()
, X11()
and win.graph()
are simple wrappers
calling windows()
, and mainly exist for compatibility reasons.
Further, x11()
and X11()
have their own help page
for Unix-alikes (where they also have more arguments).
windowsFonts
,
savePlot
, bringToTop
,
Devices
, pdf
,
x11
for Unix-alikes.
## Not run: ## A series of plots written to a sequence of metafiles if(.Platform$OS.type == "windows") win.metafile("Rplot%02d.wmf", pointsize = 10) ## End(Not run)
## Not run: ## A series of plots written to a sequence of metafiles if(.Platform$OS.type == "windows") win.metafile("Rplot%02d.wmf", pointsize = 10) ## End(Not run)
The auxiliary function windows.options
can be used to set or view
(if called without arguments) the default values for the arguments of
windows
.
windows.options
needs to be called before calling windows
,
and the default values it sets can be overridden by supplying
arguments to windows
.
windows.options(..., reset = FALSE)
windows.options(..., reset = FALSE)
... |
arguments |
reset |
logical: should the defaults be reset to their ‘factory-fresh’ values? |
If both reset = TRUE
and ...
are supplied the defaults
are first reset to the ‘factory-fresh’ values and then the new
values are applied.
Option antialias
applies to screen devices (windows
,
win.graph
, X11
and x11
). There is a separate option,
bitmap.aa.win
, for bitmap devices with type = "windows"
.
A named list of all the defaults. If any arguments are supplied the returned values are the old values and the result has the visibility flag turned off.
## Not run: ## put something like this is your .Rprofile to customize the defaults setHook(packageEvent("grDevices", "onLoad"), function(...) grDevices::windows.options(width = 8, height = 6, xpos = 0, pointsize = 10, bitmap.aa.win = "cleartype")) ## End(Not run)
## Not run: ## put something like this is your .Rprofile to customize the defaults setHook(packageEvent("grDevices", "onLoad"), function(...) grDevices::windows.options(width = 8, height = 6, xpos = 0, pointsize = 10, bitmap.aa.win = "cleartype")) ## End(Not run)
These functions handle the translation of a device-independent R graphics font family name to a windows font description and are available only on Windows.
windowsFont(family) windowsFonts(...)
windowsFont(family) windowsFonts(...)
family |
a character vector containing the font family name
( |
... |
either character strings naming mappings to display, or new (named) mappings to define. |
A windows device is created with a default font (see
the documentation for windows
), but it is also possible
to specify a font family when drawing to the device (for example, see
the documentation for "family"
in par
and for
"fontfamily"
in gpar
in the grid package).
The font family sent to the device is a simple string name, which must be mapped to something more specific to windows fonts. A list of mappings is maintained and can be modified by the user.
The windowsFonts
function can be used to list existing
mappings and to define new mappings. The windowsFont
function can be used to create a new mapping.
Default mappings are provided for three device-independent font family
names: "sans"
for a sans-serif font, "serif"
for a serif
font and "mono"
for a monospaced font.
These mappings will only be used if the current font face is 1 (plain), 2 (bold), 3 (italic), or 4 (bold italic).
if(.Platform$OS.type == "windows") withAutoprint({ windowsFonts() windowsFonts("mono") }) ## Not run: ## set up for Japanese: needs the fonts installed windows() # make sure we have the right device type (available on Windows only) Sys.setlocale("LC_ALL", "ja") windowsFonts(JP1 = windowsFont("MS Mincho"), JP2 = windowsFont("MS Gothic"), JP3 = windowsFont("Arial Unicode MS")) plot(1:10) text(5, 2, "\u{4E10}\u{4E00}\u{4E01}", family = "JP1") text(7, 2, "\u{4E10}\u{4E00}\u{4E01}", family = "JP1", font = 2) text(5, 1.5, "\u{4E10}\u{4E00}\u{4E01}", family = "JP2") text(9, 2, "\u{5100}", family = "JP3") ## End(Not run)
if(.Platform$OS.type == "windows") withAutoprint({ windowsFonts() windowsFonts("mono") }) ## Not run: ## set up for Japanese: needs the fonts installed windows() # make sure we have the right device type (available on Windows only) Sys.setlocale("LC_ALL", "ja") windowsFonts(JP1 = windowsFont("MS Mincho"), JP2 = windowsFont("MS Gothic"), JP3 = windowsFont("Arial Unicode MS")) plot(1:10) text(5, 2, "\u{4E10}\u{4E00}\u{4E01}", family = "JP1") text(7, 2, "\u{4E10}\u{4E00}\u{4E01}", family = "JP1", font = 2) text(5, 1.5, "\u{4E10}\u{4E00}\u{4E01}", family = "JP2") text(9, 2, "\u{5100}", family = "JP3") ## End(Not run)
the X11()
and x11()
functions are
simple wrappers to windows()
for historical
compatibility convenience: Calling x11()
or X11()
would work in most cases to open an interactive graphics device.
In R versions before 3.6.0, the Windows version had a shorter
list of formal arguments. Consequently, calls to X11(*)
with arguments should name them for back compatibility.
Almost all information below does not apply on Windows.
X11
starts a graphics device driver for
the X Window System (version 11). This can only be done on
machines/accounts that have access to an X server.
x11
is recognized as a synonym for X11
.
The R function is a wrapper for two devices, one based on Xlib (https://en.wikipedia.org/wiki/Xlib) and one using cairographics (https://www.cairographics.org).
X11(display = "", width, height, pointsize, gamma, bg, canvas, fonts, family, xpos, ypos, title, type, antialias, symbolfamily) X11.options(..., reset = FALSE)
X11(display = "", width, height, pointsize, gamma, bg, canvas, fonts, family, xpos, ypos, title, type, antialias, symbolfamily) X11.options(..., reset = FALSE)
display |
the display on which the graphics window will appear. The default is to use the value in the user's environment variable DISPLAY. This is ignored (with a warning) if an X11 device is already open on another display. |
width , height
|
the width and height of the plotting window, in
inches. If |
pointsize |
the default pointsize to be used. Defaults to |
gamma |
gamma correction fudge factor. Colours in R are sRGB; if your monitor does not conform to sRGB, you might be able to improve things by tweaking this parameter to apply additional gamma correction to the RGB channels. By default 1 (no additional gamma correction). |
bg |
colour, the initial background colour. Default
|
canvas |
colour. The colour of the canvas, which is visible only
when the background colour is transparent. Should be an opaque colour
(and any alpha value will be ignored). Default |
fonts |
for |
family |
The default family: a length-one character string. This
is primarily intended for cairo-based devices, but for |
xpos , ypos
|
integer: initial position of the top left corner of the
window, in pixels. Negative values are from the opposite corner,
e.g. |
title |
character string, up to 100 bytes. With the default,
|
type |
character string, one of |
antialias |
for cairo types, the type of anti-aliasing (if any)
to be used. One of |
symbolfamily |
for cairo-based devices only: a length-one character string that specifies the font family to be used as the "symbol" font (e.g., for plotmath output). The default value is "default", which means that R will choose a default "symbol" font based on the graphics device capabilities. |
reset |
logical: should the defaults be reset to their defaults? |
... |
Any of the arguments to |
The defaults for all of the arguments of X11
are set by
X11.options
: the ‘Arguments’ section gives the
‘factory-fresh’ defaults.
The initial size and position are only hints, and may not be acted on by the window manager. Also, some systems (especially laptops) are set up to appear to have a screen of a different size to the physical screen.
Option type
selects between two separate devices: R can be
built with support for neither, type = "Xlib"
or both. Where
both are available, types "cairo"
, "nbcairo"
and
"dbcairo"
offer
antialiasing of text and lines.
translucent colours.
scalable text, including to sizes like 4.5 pt.
full support for UTF-8, so on systems with suitable fonts you can plot in many languages on a single figure (and this will work even in non-UTF-8 locales). The output should be locale-independent.
There are three variants of the cairo-based device. type =
"nbcairo"
has no buffering. type = "cairo"
has some
buffering, and supports dev.hold
and dev.flush
.
type = "dbcairo"
buffers output and updates the screen about
every 100ms (by default). The refresh interval can be set (in units
of seconds) by e.g. options(X11updates = 0.25)
: the
value is consulted when a device is opened. Updates are only looked
for every 50ms (at most), and during heavy graphics computations only
every 500ms.
Which version will be fastest depends on the X11 connection and the
type of plotting. You will probably want to use a buffered type
unless backing store is in use on the X server (which for example it
always is on the x86_64
macOS XQuartz server), as otherwise
repainting when the window is exposed will be slow. On slow
connections type = "dbcairo"
will probably give the best
performance.
Because of known problems with font selection on macOS without Pango
(for example, most CRAN distributions), type = "cairo"
is not
the default there. These problems have included mixing up bold and
italic (since worked around), selecting incorrect glyphs and ugly or
missing symbol glyphs.
All devices which use an X11 server (including the type =
"Xlib"
versions of bitmap devices such as png
) share
internal structures, which means that they must use the same
display
and visual. If you want to change display, first close
all such devices.
The cursor shown indicates the state of the device. If quiescent the cursor is an arrow: when the locator is in use it is a crosshair cursor, and when plotting computations are in progress (and this can be detected) it is a watch cursor. (The exact cursors displayed will depend on the window manager in use.)
This section applies only to type = "Xlib"
.
An initial/default font family for the device can be specified via
the fonts
argument, but if a device-independent R graphics font
family is specified (e.g., via par(family =)
in the graphics
package), the X11 device makes use of the X11 font database (see
X11Fonts
) to convert the R graphics font family to an
X11-specific font family description. If family
is supplied as
an argument, the X11 font database is used to convert that, but
otherwise the argument fonts
(with default given by
X11.options
) is used.
X11 chooses fonts by matching to a pattern, and it is quite possible
that it will choose a font in the wrong encoding or which does not
contain glyphs for your language (particularly common in
iso10646-1
fonts).
The fonts
argument is a two-element character vector, and the
first element will be crucial in successfully using
non-Western-European fonts. Settings that have proved useful include
"-*-mincho-%s-%s-*-*-%d-*-*-*-*-*-*-*"
for CJK languages and
"-cronyx-helvetica-%s-%s-*-*-%d-*-*-*-*-*-*-*"
for Russian.
For UTF-8 locales, the XLC_LOCALE
databases provide mappings
between character encodings, and you may need to add an entry for your
locale (e.g., Fedora Core 3 lacked one for ru_RU.utf8
).
The cairographics-based devices work directly with font family names
such as "Helvetica"
which can be selected initially by the
family
argument and subsequently by par
or
gpar
. There are mappings for the three
device-independent font families, "sans"
for a sans-serif font
(to "Helvetica"
), "serif"
for a serif font (to
"Times"
) and "mono"
for a monospaced font (to
"Courier"
).
The font selection is handled by Pango
(usually via
fontconfig
) or fontconfig
(on macOS and perhaps
elsewhere). The results depend on the fonts installed on the system
running R – setting the environment variable FC_DEBUG to 1
normally allows some tracing of the selection process.
This works best when high-quality scalable fonts are installed,
usually in Type 1 or TrueType formats: see the
‘R Installation and Administration’ manual for advice on how to
obtain and install such fonts.
At present the best rendering (including using kerning)
will be achieved with TrueType fonts: see
https://www.freedesktop.org/software/fontconfig/fontconfig-user.html
for ways to set up your system to prefer them. The default family
("Helvetica"
) is likely not to use kerning: alternatives which
should if you have them installed are "Arial"
,
"DejaVu Sans"
and "Liberation Sans"
(and perhaps
"FreeSans"
). For those who prefer fonts with serifs, try
"Times New Roman"
, "DejaVu Serif"
and "Liberation
Serif"
. To match LaTeX text, use something like "CM Roman"
.
Fedora systems from version 31 on do not like the default "symbol"
font family for rendering symbols (e.g., plotmath). For those
systems, users should specify a different font via
symbolfamily
. The default can also be changed via
X11.options
.
Problems with incorrect rendering of symbols (e.g., of
quote(pi)
and expression(10^degree)
)
have been seen on Linux systems which have the Wine
symbol font installed – fontconfig
then prefers this and
misinterprets its encoding. Adding the following lines
to ‘~/.fonts.conf’ or ‘/etc/fonts/local.conf’ may circumvent
this problem by preferring the URW Type 1 symbol font.
<fontconfig> <match target="pattern"> <test name="family"><string>Symbol</string></test> <edit name="family" mode="prepend" binding="same"> <string>Standard Symbols L</string> </edit> </match> </fontconfig>
A test for this is to run at the command line fc-match Symbol
.
If that shows symbol.ttf
that may be the Wine symbol font – use
locate symbol.ttf
to see if it is found from a directory with
‘wine’ in the name.
The standard X11 resource geometry
can be used to specify the
window position and/or size, but will be overridden by values
specified as arguments or non-NA
defaults set in
X11.options
. The class looked for is R_x11
. Note that
the resource specifies the width and height in pixels and not in
inches. See for example ‘man X’ (or
https://www.x.org/releases/current/).
An example line in ‘~/.Xresources’ might be
R_x11*geometry: 900x900-0+0
which specifies a 900 x 900 pixel window at the top right of the screen.
X11 supports several ‘visual’ types, and nowadays almost all
systems support ‘truecolor’ which X11
will use by
default. This uses a direct specification of any RGB colour up to the
depth supported (usually 8 bits per colour). Other visuals make use
of a palette to support fewer colours, only grays or even only
black/white. The palette is shared between all X11 clients, so it can
be necessary to limit the number of colours used by R.
The default for type = "Xlib"
is to use the best possible colour
model for the visual of the X11 server: these days this will almost
always be ‘truecolor’. This can be overridden by the
colortype
argument of X11.options
. Note: All
X11
and type = "Xlib"
bmp
, jpeg
,
png
and tiff
devices share a colortype
which is
set when the first device to be opened. To change the
colortype
you need to close all open such devices, and
then use X11.options(colortype =)
.
The colortype types are tried in the order "true"
,
"pseudo"
, "gray"
and "mono"
(black or white
only). The values "pseudo"
and "pseudo.cube"
provide
two colour strategies for a pseudocolor visual. The first strategy
provides on-demand colour allocation which produces exact colours
until the colour resources of the display are exhausted (when plotting
will fail). The second allocates (if possible) a standard colour
cube, and requested colours are approximated by the closest value in
the cube.
With colortype
equal to "pseudo.cube"
or "gray"
successively smaller palettes are tried until one is completely
allocated. If allocation of the smallest attempt fails the device will
revert to "mono"
. For "gray"
the search starts at 256
grays for a display with depth greater than 8, otherwise with half
the available colours. For "pseudo.cube"
the maximum cube size
is set by X11.options(maxcolorsize =)
and defaults to
256. With that setting the largest cube tried is 4 levels each for
RGB, using 64 colours in the palette.
The cairographics-based devices most likely only work (or work correctly) with ‘TrueColor’ visuals, although in principle this depends on the cairo installation: a warning is given if any other visual is encountered.
type = "Xlib"
supports ‘TrueColor’,
‘PseudoColor’, ‘GrayScale’, StaticGray
and
MonoChrome
visuals: ‘StaticColor’ and
‘DirectColor’ visuals are handled only in black/white.
Anti-aliasing is only supported for cairographics-based devices, and
applies to both graphics and fonts. It is generally preferable for
lines and text, but can lead to undesirable effects for fills,
e.g. for image
plots, and so is never used for fills.
antialias = "default"
is in principle platform-dependent, but
seems most often equivalent to antialias = "gray"
.
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is 7 inches square.
Font sizes are in big points.
The default font family is Helvetica.
Line widths in 1/96 inch, minimum one pixel for type =
"Xlib"
, 0.01 otherwise.
For type = "Xlib"
circle radii are in pixels with
minimum one.
Colours are interpreted by the X11 server, which is assumed to conform to sRGB.
Support for all the Unix devices is optional, so in packages
X11()
should be used conditionally after checking
capabilities("X11")
.
## Not run: if(.Platform$OS.type == "unix") { # Only on unix-alikes, possibly Mac, ## put something like this is your .Rprofile to customize the defaults setHook(packageEvent("grDevices", "onLoad"), function(...) grDevices::X11.options(width = 8, height = 6, xpos = 0, pointsize = 10)) } ## End(Not run)
## Not run: if(.Platform$OS.type == "unix") { # Only on unix-alikes, possibly Mac, ## put something like this is your .Rprofile to customize the defaults setHook(packageEvent("grDevices", "onLoad"), function(...) grDevices::X11.options(width = 8, height = 6, xpos = 0, pointsize = 10)) } ## End(Not run)
These functions handle the translation of a device-independent R graphics font family name to an X11 font description on Unix-alike platforms.
X11Font(font) X11Fonts(...)
X11Font(font) X11Fonts(...)
font |
a character string containing an X11 font description. |
... |
either character strings naming mappings to display, or new (named) mappings to define. |
These functions apply only to an X11
device with
type = "Xlib"
– X11(type = "cairo")
uses a different
mechanism to select fonts.
Such a device is created with a default font (see
the documentation for X11
), but it is also possible
to specify a font family when drawing to the device (for example, see
the documentation for "family"
in par
and for
"fontfamily"
in gpar
in the grid package).
The font family sent to the device is a simple string name, which must be mapped to something more specific to X11 fonts. A list of mappings is maintained and can be modified by the user.
The X11Fonts
function can be used to list existing
mappings and to define new mappings. The X11Font
function can be used to create a new mapping.
Default mappings are provided for three device-independent font family
names: "sans"
for a sans-serif font, "serif"
for a serif
font and "mono"
for a monospaced font. Further mappings are
provided for "Helvetica"
(the device default), "Times"
,
"CyrHelvetica"
, "CyrTimes"
(versions of these fonts with
Cyrillic support, at least on Linux), "Arial"
(on some
platforms including macOS) and "Mincho"
(a CJK
font).
Available only when capabilities()[["X11"]]
is true.
if(capabilities("X11")) withAutoprint({ X11Fonts() X11Fonts("mono") utopia <- X11Font("-*-utopia-*-*-*-*-*-*-*-*-*-*-*-*") X11Fonts(utopia = utopia) })
if(capabilities("X11")) withAutoprint({ X11Fonts() X11Fonts("mono") utopia <- X11Font("-*-utopia-*-*-*-*-*-*-*-*-*-*-*-*") X11Fonts(utopia = utopia) })
xfig
starts the graphics device driver for producing XFig
(version 3.2) graphics.
It was deprecated in R 4.4.0: consider using an SVG device for editable graphics.
The auxiliary function ps.options
can be used to set and view
(if called without arguments) default values for the arguments to
xfig
and postscript
.
xfig(file = if(onefile) "Rplots.fig" else "Rplot%03d.fig", onefile = FALSE, encoding = "none", paper = "default", horizontal = TRUE, width = 0, height = 0, family = "Helvetica", pointsize = 12, bg = "transparent", fg = "black", pagecentre = TRUE, defaultfont = FALSE, textspecial = FALSE)
xfig(file = if(onefile) "Rplots.fig" else "Rplot%03d.fig", onefile = FALSE, encoding = "none", paper = "default", horizontal = TRUE, width = 0, height = 0, family = "Helvetica", pointsize = 12, bg = "transparent", fg = "black", pagecentre = TRUE, defaultfont = FALSE, textspecial = FALSE)
file |
a character string giving the file path. For use
with See section ‘File specifications’ in the help
for |
onefile |
logical: if true allow multiple figures in one file. If false, assume only one page per file and generate a file number containing the page number. |
encoding |
The encoding in which to write text strings. The
default is not to re-encode. This can be any encoding recognized by
|
paper |
the size of paper region. The choices
are |
horizontal |
the orientation of the printed image, a logical. Defaults to true, that is landscape orientation. |
width , height
|
the width and height of the
graphics region in inches. The default is to use the entire
page less a 0.5 inch overall margin in each direction. (See
|
family |
the font family to be used. This must be one
of |
pointsize |
the default point size to be used. |
bg |
the initial background color to be used. |
fg |
the initial foreground color to be used. |
pagecentre |
logical: should the device region be centred on the page? |
defaultfont |
logical: should the device use XFig's default font? |
textspecial |
logical: should the device set the textspecial flag for all text elements? This is useful when generating pstex from XFig figures. |
Although xfig
can produce multiple plots in one file, the XFig
format does not say how to separate or view them. So
onefile = FALSE
is the default.
The file
argument is interpreted as a C integer format as used
by sprintf
, with integer argument the page number.
The default gives files ‘Rplot001.fig’, ..., ‘Rplot999.fig’,
‘Rplot1000.fig’, ....
Line widths as controlled by par(lwd =)
are in multiples of
5/6*1/72 inch. Multiples less than 1 are allowed. pch = "."
with
cex = 1
corresponds to a square of side 1/72 inch.
Windows users could make use of WinFIG (http://winfig.com/, shareware).
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is the paper size with a 0.25 inch border on all sides.
Font sizes are in big points.
The default font family is Helvetica.
Line widths are integers, multiples of 5/432 inch.
Circle radii are multiples of 1/1200 inch.
Colours are interpreted by the viewing/printing application.
Only some line textures (0 <= lty < 4
) are used. Eventually this
may be partially remedied, but the XFig file format does not allow as
general line textures as the R model. Unimplemented line textures
are displayed as dash-double-dotted.
There is a limit of 512 colours (plus white and black) per file.
Brian Ripley. Support for defaultFont
and textSpecial
contributed by Sebastian Fischmeister.
Devices
,
postscript
,
ps.options
.
xy.coords
is used by many functions to obtain
x and y coordinates for plotting. The use of this common mechanism
across all relevant R functions produces a measure of consistency.
xy.coords(x, y = NULL, xlab = NULL, ylab = NULL, log = NULL, recycle = FALSE, setLab = TRUE)
xy.coords(x, y = NULL, xlab = NULL, ylab = NULL, log = NULL, recycle = FALSE, setLab = TRUE)
x , y
|
the x and y coordinates of a set of points.
Alternatively, a single argument |
xlab , ylab
|
names for the x and y variables to be extracted. |
log |
character, |
recycle |
logical; if |
setLab |
logical indicating if the resulting |
An attempt is made to interpret the arguments x
and y
in
a way suitable for bivariate plotting (or other bivariate procedures).
If y
is NULL
and x
is a
of the form yvar ~ xvar
. xvar
and
yvar
are used as x and y variables.
containing components x
and y
, these are
used to define plotting coordinates.
the x values are taken to be
time(x)
and the y values to be the time series.
data.frame
with two or more
columns:the first is assumed to contain the x values and the
second the y values. Note that is also true if x
has columns named "x"
and "y"
; these names will be
irrelevant here.
In any other case, the x
argument is coerced to a vector and
returned as y component where the resulting x
is just
the index vector 1:n
. In this case, the resulting xlab
component is set to "Index"
(if setLab
is true as by default).
If x
(after transformation as above) inherits from class
"POSIXt"
it is coerced to class "POSIXct"
.
A list with the components
x |
numeric (i.e., |
y |
numeric vector of the same length as |
xlab |
|
ylab |
|
plot.default
, lines
, points
and lowess
are examples of functions which use this mechanism.
ff <- stats::fft(1:9) xy.coords(ff) xy.coords(ff, xlab = "fft") # labels "Re(fft)", "Im(fft)" with(cars, xy.coords(dist ~ speed, NULL)$xlab ) # = "speed" xy.coords(1:3, 1:2, recycle = TRUE) # otherwise error "lengths differ" xy.coords(-2:10, log = "y") ##> xlab: "Index" \\ warning: 3 y values <= 0 omitted .. op <- options(warn = 2)# ==> warnings would be errors, we suppress the one "we know": suppressWarnings(xy.coords(-2:10, log = "y"), classes="log_le_0") -> xy options(op) # revert stopifnot(is.list(xy), identical (1:13 +0, xy$x), identical(c(rep(NA, 3), 1:10 +0), xy$y))
ff <- stats::fft(1:9) xy.coords(ff) xy.coords(ff, xlab = "fft") # labels "Re(fft)", "Im(fft)" with(cars, xy.coords(dist ~ speed, NULL)$xlab ) # = "speed" xy.coords(1:3, 1:2, recycle = TRUE) # otherwise error "lengths differ" xy.coords(-2:10, log = "y") ##> xlab: "Index" \\ warning: 3 y values <= 0 omitted .. op <- options(warn = 2)# ==> warnings would be errors, we suppress the one "we know": suppressWarnings(xy.coords(-2:10, log = "y"), classes="log_le_0") -> xy options(op) # revert stopifnot(is.list(xy), identical (1:13 +0, xy$x), identical(c(rep(NA, 3), 1:10 +0), xy$y))
Given (x,y) points, determine their multiplicity – checking for equality only up to some (crude kind of) noise. Note that this is special kind of 2D binning.
xyTable(x, y = NULL, digits)
xyTable(x, y = NULL, digits)
x , y
|
numeric vectors of the same length; alternatively other
(x, y) argument combinations as allowed by
|
digits |
integer specifying the significant digits to be used for
determining equality of coordinates. These are compared after
rounding them via |
A list with three components of same length,
x |
x coordinates, rounded and sorted. |
y |
y coordinates, rounded (and sorted within |
number |
multiplicities (positive integers); i.e.,
|
sunflowerplot
which typically uses
xyTable()
; signif
.
xyTable(iris[, 3:4], digits = 6) ## Discretized uncorrelated Gaussian: xy <- data.frame(x = round(sort(stats::rnorm(100))), y = stats::rnorm(100)) xyTable(xy, digits = 1)
xyTable(iris[, 3:4], digits = 6) ## Discretized uncorrelated Gaussian: xy <- data.frame(x = round(sort(stats::rnorm(100))), y = stats::rnorm(100)) xyTable(xy, digits = 1)
Utility for obtaining consistent x, y and z coordinates and labels for three dimensional (3D) plots.
xyz.coords(x, y = NULL, z = NULL, xlab = NULL, ylab = NULL, zlab = NULL, log = NULL, recycle = FALSE, setLab = TRUE)
xyz.coords(x, y = NULL, z = NULL, xlab = NULL, ylab = NULL, zlab = NULL, log = NULL, recycle = FALSE, setLab = TRUE)
x , y , z
|
the x, y and z coordinates of a set of points.
Both If the argument is a formula Alternatively two arguments |
xlab , ylab , zlab
|
names for the x, y and z variables to be extracted. |
log |
character, |
recycle |
logical; if |
setLab |
logical indicating if the resulting |
A list with the components
x |
numeric (i.e., |
y |
numeric vector of the same length as |
z |
numeric vector of the same length as |
xlab |
|
ylab |
|
zlab |
|
Uwe Ligges and Martin Maechler
xy.coords
for 2D.
xyz.coords(data.frame(10*1:9, -4), y = NULL, z = NULL) xyz.coords(1:5, stats::fft(1:5), z = NULL, xlab = "X", ylab = "Y") y <- 2 * (x2 <- 10 + (x1 <- 1:10)) xyz.coords(y ~ x1 + x2, y = NULL, z = NULL) xyz.coords(data.frame(x = -1:9, y = 2:12, z = 3:13), y = NULL, z = NULL, log = "xy") ##> Warning message: 2 x values <= 0 omitted ... ## Suppress this specific warning: suppressWarnings(xyz.coords(x = -1:9, y = 2:12, z = 3:13, log = "xy"), classes = "log_le_0")
xyz.coords(data.frame(10*1:9, -4), y = NULL, z = NULL) xyz.coords(1:5, stats::fft(1:5), z = NULL, xlab = "X", ylab = "Y") y <- 2 * (x2 <- 10 + (x1 <- 1:10)) xyz.coords(y ~ x1 + x2, y = NULL, z = NULL) xyz.coords(data.frame(x = -1:9, y = 2:12, z = 3:13), y = NULL, z = NULL, log = "xy") ##> Warning message: 2 x values <= 0 omitted ... ## Suppress this specific warning: suppressWarnings(xyz.coords(x = -1:9, y = 2:12, z = 3:13, log = "xy"), classes = "log_le_0")