From 0b502ce8ea4f051f77e17c4a81dbe476b32e53db Mon Sep 17 00:00:00 2001 From: nfrerebeau Date: Wed, 23 Aug 2023 13:08:19 +0200 Subject: [PATCH] Fix graphical parameters (again) --- R/AllGenerics.R | 76 ++--- R/biplot.R | 7 +- R/dimensio-internal.R | 16 +- R/viz_coordinates.R | 234 +++++++------- R/viz_labels.R | 1 - README.Rmd | 6 +- README.md | 6 +- inst/examples/ex-plot.R | 31 +- inst/examples/ex-wrap.R | 4 +- inst/tinytest/_tinysnapshot/CA_boot_col.svg | 248 ++++++--------- inst/tinytest/_tinysnapshot/CA_boot_row.svg | 248 ++++++--------- inst/tinytest/_tinysnapshot/PCA_boot_col.svg | 248 ++++++--------- .../_tinysnapshot/PCA_var_group_cat.svg | 16 +- .../PCA_var_highlight_contrib.svg | 300 +++++++++--------- inst/tinytest/test_plot_ca.R | 6 +- inst/tinytest/test_plot_pca.R | 21 +- inst/tinytest/test_scale.R | 59 ++-- man/figures/README-biplot-1.png | Bin 23677 -> 23733 bytes man/figures/README-plot-ind-2.png | Bin 19271 -> 19034 bytes man/figures/README-plot-var-1.png | Bin 17440 -> 17455 bytes man/viz_individuals.Rd | 84 +++-- man/viz_variables.Rd | 84 +++-- man/viz_wrap.Rd | 4 +- man/wrap.Rd | 4 +- vignettes/pca.Rmd | 13 +- 25 files changed, 790 insertions(+), 926 deletions(-) diff --git a/R/AllGenerics.R b/R/AllGenerics.R index 4a83328..52cdbdc 100644 --- a/R/AllGenerics.R +++ b/R/AllGenerics.R @@ -560,38 +560,40 @@ NULL #' @param sup A [`logical`] scalar: should the supplementary observations be #' plotted? #' @param labels A [`logical`] scalar: should labels be drawn? -#' @param map_color,map_shape,map_size A vector specifying the -#' information to be highlighted. It will be mapped to the corresponding -#' aesthetic (see examples and vignettes). +#' @param highlight A vector specifying the information to be highlighted. +#' If `NULL` (the default), no highlighting is applied. +#' It will only be mapped if at least one [graphical parameters][graphics::par] +#' is explicitly specified (see examples). #' If a single `character` string is passed, it must be one of "`observation`", -#' "`mass`", "`sum`", "`contribution`" or "`cos2`" (see details). +#' "`mass`", "`sum`", "`contribution`" or "`cos2`" (see [`augment()`]). #' Any unambiguous substring can be given. -#' If `NULL` (the default), no highlighting is applied. #' @param main A [`character`] string giving a main title for the plot. #' @param sub A [`character`] string giving a subtitle for the plot. +#' @param panel.first An an `expression` to be evaluated after the plot axes are +#' set up but before any plotting takes place. This can be useful for drawing +#' background grids. +#' @param panel.last An `expression` to be evaluated after plotting has taken +#' place but before the axes, title and box are added. #' @param ... Further [graphical parameters][graphics::par] (see details). #' @details -#' Available statistics: -#' \describe{ -#' \item{`observation`}{Whether an observation is active or supplementary.} -#' \item{`mass`}{Weight/mass of each observation.} -#' \item{`sum`}{Sum of squared coordinates along `axes`.} -#' \item{`contribution`}{Joint contributions to the definition of `axes`.} -#' \item{`cos2`}{Joint \eqn{cos^2}{cos2} along `axes`.} -#' } -#' #' Commonly used [graphical parameters][graphics::par] are: #' \describe{ -#' \item{`col`}{The colors for lines and points. Multiple colors can be -#' specified so that each point can be given its own color.} -#' \item{`pch`}{A vector of plotting characters or symbols.} +#' \item{`pch`}{A vector of plotting characters or symbols. This can either be +#' a single character or an integer code for one of a set of +#' graphics symbols.} #' \item{`cex`}{A numerical vector giving the amount by which plotting #' characters and symbols should be scaled relative to the #' default.} +#' \item{`col`}{The colors for lines and points. Multiple colors can be +#' specified so that each point can be given its own color.} +#' \item{`bg`}{The background color for the open plot symbols given by +#' `pch = 21:25`.} #' } #' @return #' `viz_*()` is called for its side-effects: it results in a graphic #' being displayed. Invisibly returns `x`. +#' @note +#' Be careful: graphical parameters are silently recycled. #' @example inst/examples/ex-plot.R #' @author N. Frerebeau #' @docType methods @@ -612,48 +614,28 @@ setGeneric( #' Visualize Variables Factor Map #' #' Plots column/variable principal coordinates. -#' @param x A [`CA-class`] or [`PCA-class`] object. -#' @param axes A length-two [`numeric`] vector giving the dimensions to be -#' plotted. -#' @param active A [`logical`] scalar: should the active observations be -#' plotted? -#' @param sup A [`logical`] scalar: should the supplementary observations be -#' plotted? -#' @param labels A [`logical`] scalar: should labels be drawn? -#' @param map_color,map_shape,map_size,map_linetype,map_linewidth A vector -#' specifying the information to be highlighted. It will be mapped to the -#' corresponding aesthetic (see examples and vignettes). -#' If a single `character` string is passed, it must be one of "`observation`", -#' "`mass`", "`sum`", "`contribution`" or "`cos2`" (see details). -#' Any unambiguous substring can be given. -#' If `NULL` (the default), no highlighting is applied. -#' @param main A [`character`] string giving a main title for the plot. -#' @param sub A [`character`] string giving a subtitle for the plot. -#' @param ... Further [graphical parameters][graphics::par] (see details). +#' @inheritParams viz_individuals #' @details -#' Available statistics: -#' \describe{ -#' \item{`observation`}{Whether an observation is active or supplementary.} -#' \item{`mass`}{Weight/mass of each observation.} -#' \item{`sum`}{Sum of squared coordinates along `axes`.} -#' \item{`contribution`}{Joint contributions to the definition of `axes`.} -#' \item{`cos2`}{Joint \eqn{cos^2}{cos2} along `axes`.} -#' } -#' #' Commonly used [graphical parameters][graphics::par] are: #' \describe{ -#' \item{`col`}{The colors for lines and points. Multiple colors can be -#' specified so that each point can be given its own color.} -#' \item{`pch`}{A vector of plotting characters or symbols.} +#' \item{`pch`}{A vector of plotting characters or symbols. This can either be +#' a single character or an integer code for one of a set of +#' graphics symbols.} #' \item{`cex`}{A numerical vector giving the amount by which plotting #' characters and symbols should be scaled relative to the #' default.} #' \item{`lty`}{A vector of line types.} #' \item{`lwd`}{A vector of line widths.} +#' \item{`col`}{The colors for lines and points. Multiple colors can be +#' specified so that each point can be given its own color.} +#' \item{`bg`}{The background color for the open plot symbols given by +#' `pch = 21:25`.} #' } #' @return #' `viz_*()` is called for its side-effects: it results in a graphic #' being displayed. Invisibly returns `x`. +#' @note +#' Be careful: graphical parameters are silently recycled. #' @example inst/examples/ex-plot.R #' @author N. Frerebeau #' @docType methods diff --git a/R/biplot.R b/R/biplot.R index 6174f9d..94616a6 100644 --- a/R/biplot.R +++ b/R/biplot.R @@ -170,18 +170,15 @@ viz_biplot <- function(coord_row, coord_col, rows = TRUE, columns = TRUE, } ## Labels - usr <- graphics::par("usr") - xlim <- usr[c(1, 2)] - ylim <- usr[c(3, 4)] if (!is.null(labels)) { labels <- match.arg(labels, several.ok = TRUE) if (any(labels == "rows") | any(labels == "individuals")) { viz_labels(x = coord_row$x, y = coord_row$y, labels = coord_row$label, - xlim = xlim, ylim = ylim, col = col.rows, ...) + col = col.rows, ...) } if (any(labels == "columns") | any(labels == "variables")) { viz_labels(x = coord_col$x, y = coord_col$y, labels = coord_col$label, - xlim = xlim, ylim = ylim, col = col.columns, ...) + col = col.columns, ...) } } diff --git a/R/dimensio-internal.R b/R/dimensio-internal.R index e4e6ff6..5a08c28 100644 --- a/R/dimensio-internal.R +++ b/R/dimensio-internal.R @@ -7,7 +7,7 @@ recycle <- function(x, n, verbose = getOption("dimensio.verbose")) { if (length(x) >= n) return(x[seq_len(n)]) - if (verbose) { + if (verbose && length(x) > 1) { arg <- deparse(substitute(x)) msg <- sprintf("Note that %s was recycled to length %d.", sQuote(arg), n) message(msg) @@ -16,6 +16,20 @@ recycle <- function(x, n, verbose = getOption("dimensio.verbose")) { x } +#' Rescale Continuous Vector +#' +#' Rescales continuous vector to have specified minimum and maximum. +#' @param x A continuous `vector` of values to manipulate. +#' @param to A length-two [`numeric`] vector specifying the output range. +#' @param from A length-two [`numeric`] vector specifying the input range. +#' @return A [`numeric`] vector. +#' @keywords internal +#' @noRd +scale_range <- function(x, to = c(0, 1), + from = range(x, na.rm = TRUE, finite = TRUE)) { + (x - from[1L]) / diff(from) * diff(to) + to[1L] +} + #' Weighted Column Means and Standard Deviations #' #' @param x A [`numeric`] matrix. diff --git a/R/viz_coordinates.R b/R/viz_coordinates.R index 5a006d5..a3a309b 100644 --- a/R/viz_coordinates.R +++ b/R/viz_coordinates.R @@ -10,13 +10,13 @@ setMethod( f = "viz_rows", signature = c(x = "MultivariateAnalysis"), definition = function(x, axes = c(1, 2), active = TRUE, sup = TRUE, - labels = FALSE, map_color = NULL, - map_shape = NULL, map_size = NULL, - main = NULL, sub = NULL, ...) { + labels = FALSE, highlight = NULL, + main = NULL, sub = NULL, + panel.first = NULL, panel.last = NULL, ...) { viz_points(x, margin = 1, axes = axes, active = active, sup = sup, - labels = labels, map_color = map_color, - map_shape = map_shape, map_size = map_size, - main = main, sub = sub, ...) + labels = labels, highlight = highlight, + main = main, sub = sub, + panel.first = panel.first, panel.last = panel.last, ...) invisible(x) } ) @@ -29,9 +29,8 @@ setMethod( signature = c(x = "BootstrapCA"), definition = function(x, axes = c(1, 2), ...) { group <- get_groups(x, margin = 1) - viz_points(x, margin = 1, axes = axes, - active = TRUE, sup = TRUE, labels = FALSE, - map_color = group, map_shape = group, ...) + viz_points(x, margin = 1, axes = axes, active = TRUE, sup = TRUE, + labels = FALSE, highlight = group, ...) invisible(x) } ) @@ -44,12 +43,12 @@ setMethod( f = "viz_individuals", signature = c(x = "PCA"), definition = function(x, axes = c(1, 2), active = TRUE, sup = TRUE, - labels = FALSE, map_color = NULL, - map_shape = NULL, map_size = NULL, - main = NULL, sub = NULL, ...) { + labels = FALSE, highlight = NULL, + main = NULL, sub = NULL, + panel.first = NULL, panel.last = NULL, ...) { viz_rows(x, axes = axes, active = active, sup = sup, labels = labels, - map_color = map_color, map_shape = map_shape, map_size = map_size, - main = main, sub = sub, ...) + highlight = highlight, main = main, sub = sub, + panel.first = panel.first, panel.last = panel.last, ...) invisible(x) } ) @@ -63,13 +62,13 @@ setMethod( f = "viz_columns", signature = c(x = "MultivariateAnalysis"), definition = function(x, axes = c(1, 2), active = TRUE, sup = TRUE, - labels = FALSE, map_color = NULL, - map_shape = NULL, map_size = NULL, - main = NULL, sub = NULL, ...) { + labels = FALSE, highlight = NULL, + main = NULL, sub = NULL, + panel.first = NULL, panel.last = NULL, ...) { viz_points(x, margin = 2, axes = axes, active = active, sup = sup, - labels = labels, map_color = map_color, - map_shape = map_shape, map_size = map_size, - main = main, sub = sub, ...) + labels = labels, highlight = highlight, + main = main, sub = sub, + panel.first = panel.first, panel.last = panel.last, ...) invisible(x) } ) @@ -83,7 +82,7 @@ setMethod( definition = function(x, axes = c(1, 2), ...) { group <- get_groups(x, margin = 2) viz_points(x, margin = 2, axes = axes, active = TRUE, sup = TRUE, - labels = FALSE, map_color = group, map_shape = group, ...) + labels = FALSE, highlight = group, ...) invisible(x) } ) @@ -96,17 +95,12 @@ setMethod( f = "viz_variables", signature = c(x = "PCA"), definition = function(x, axes = c(1, 2), active = TRUE, sup = TRUE, - labels = TRUE, map_color = NULL, - map_linetype = NULL, map_linewidth = NULL, - main = NULL, sub = NULL, ...) { + labels = TRUE, highlight = NULL, + main = NULL, sub = NULL, + panel.first = NULL, panel.last = NULL, ...) { ## Prepare data coord <- prepare_coord(x, margin = 2, axes = axes, active = active, - sup = sup) - - ## Graphical parameters - param <- prepare_param(coord, map_color = map_color, - map_linetype = map_linetype, - map_linewidth = map_linewidth, ...) + sup = sup, highlight = highlight, ...) ## Save and restore graphical parameters ## pty: square plotting region, independent of device size @@ -126,7 +120,7 @@ setMethod( graphics::plot.window(xlim = xlim, ylim = ylim, asp = 1) ## Evaluate pre-plot expressions - # panel.first + panel.first ## Plot graphics::abline(h = 0, lty = "dashed", lwd = 1, col = graphics::par("fg")) @@ -140,17 +134,19 @@ setMethod( graphics::arrows( x0 = 0, y0 = 0, x1 = coord$x, y1 = coord$y, length = 0.15, angle = 30, - col = param$col, lty = param$lty, lwd = param$lwd + col = coord$col, + lty = coord$lty, + lwd = coord$lwd ) ## Labels if (labels && nrow(coord) > 1) { viz_labels(x = coord$x, y = coord$y, labels = coord$label, - col = param$col, cex = param$cex) + col = coord$col, cex = coord$cex) } ## Evaluate post-plot and pre-axis expressions - # panel.last + panel.last ## Construct axis (axes) if (TRUE) { @@ -185,22 +181,20 @@ setMethod( definition = function(x, axes = c(1, 2), ...) { group <- get_groups(x, margin = 2) viz_points(x, margin = 2, axes = axes, active = TRUE, sup = TRUE, - labels = FALSE, map_color = group, map_shape = group, ...) + labels = FALSE, highlight = group, ...) invisible(x) } ) # Helpers ====================================================================== viz_points <- function(x, margin, axes, active = TRUE, sup = TRUE, labels = FALSE, - map_color = NULL, map_shape = NULL, map_size = NULL, - main = NULL, sub = NULL, ...) { + highlight = NULL, main = NULL, sub = NULL, + xlab = NULL, ylab = NULL, ann = graphics::par("ann"), + frame.plot = TRUE, + panel.first = NULL, panel.last = NULL, ...) { ## Prepare data coord <- prepare_coord(x, margin = margin, axes = axes, active = active, - sup = sup) - - ## Graphical parameters - param <- prepare_param(coord, map_color = map_color, map_shape = map_shape, - map_size = map_size, alpha = FALSE, ...) + sup = sup, highlight = highlight, ...) ## Save and restore graphical parameters ## pty: square plotting region, independent of device size @@ -218,22 +212,28 @@ viz_points <- function(x, margin, axes, active = TRUE, sup = TRUE, labels = FALS graphics::plot.window(xlim = xlim, ylim = ylim, asp = 1) ## Evaluate pre-plot expressions - # panel.first + panel.first ## Plot graphics::abline(h = 0, lty = "dashed", lwd = 1, col = graphics::par("fg")) graphics::abline(v = 0, lty = "dashed", lwd = 1, col = graphics::par("fg")) - graphics::points(x = coord$x, y = coord$y, col = param$col, - pch = param$pch, cex = param$cex) + graphics::points( + x = coord$x, + y = coord$y, + col = coord$col, + bg = coord$bg, + pch = coord$pch, + cex = coord$cex + ) ## Labels if (labels) { viz_labels(x = coord$x, y = coord$y, labels = coord$label, - col = param$col, cex = param$cex) + col = coord$col, cex = coord$cex) } ## Evaluate post-plot and pre-axis expressions - # panel.last + panel.last ## Construct axis (axes) if (TRUE) { @@ -241,21 +241,21 @@ viz_points <- function(x, margin, axes, active = TRUE, sup = TRUE, labels = FALS graphics::axis(side = 2, las = 1) } - ## Plot frame (frame.plot) - if (TRUE) { + ## Plot frame + if (frame.plot) { graphics::box() } - ## Add annotation (ann) - if (TRUE) { + ## Add annotation + if (ann) { graphics::title( main = main, sub = sub, - xlab = print_variance(x, axes[[1]]), - ylab = print_variance(x, axes[[2]]) + xlab = xlab %||% print_variance(x, axes[[1]]), + ylab = ylab %||% print_variance(x, axes[[2]]) ) } - invisible(param) + invisible(coord) } print_variance <- function(object, axis) { @@ -294,7 +294,8 @@ plot_circle <- function(x, y, radius, n = 100, ...) { # * `label`, `supplementary`, `mass`, `sum`, `contribution`, `cos2`, # * `x`, `y`, `group`, `data`, `observation` prepare_coord <- function(object, margin, axes = c(1, 2), active = TRUE, - sup = TRUE, principal = TRUE, group = NULL) { + sup = TRUE, principal = TRUE, group = NULL, + highlight = NULL, ...) { ## Prepare data data <- augment(object, margin = margin, axes = axes, principal = principal) data$x <- data[[1]] @@ -319,80 +320,66 @@ prepare_coord <- function(object, margin, axes = c(1, 2), active = TRUE, if (!active & sup) data <- data[data$supplementary, ] data$observation <- ifelse(data$supplementary, "suppl.", "active") - data + ## Graphical parameters + param <- prepare_param(data, highlight = highlight, ...) + + cbind(data, param) } -prepare_param <- function(x, map_color = NULL, map_shape = NULL, - map_size = NULL, map_linetype = NULL, - map_linewidth = NULL, alpha = FALSE, ...) { +prepare_param <- function(x, highlight = NULL, alpha = FALSE, ...) { + ## Graphical parameters + col <- list(...)$col + bg <- list(...)$bg + pch <- list(...)$pch + cex <- list(...)$cex + lty <- list(...)$lty + lwd <- list(...)$lwd + n <- nrow(x) - choices <- c("observation", "mass", "sum", "contribution", "cos2") + if (length(highlight) == 1) { + choices <- c("mass", "sum", "contribution", "cos2", "observation") + highlight <- match.arg(highlight, choices = choices, several.ok = FALSE) + highlight <- x[[highlight]] + } + if (length(highlight) > 1) assert_length(highlight, n) ## Colors - if (length(map_color) == 1) { - map_color <- match.arg(map_color, choices = choices) - map_color <- x[[map_color]] - } - col <- scale_color(x = map_color, n = n, col = list(...)$col, alpha = alpha) + col <- scale_color(x = highlight, col = col, alpha = alpha) + bg <- scale_color(x = highlight, col = bg, alpha = alpha) ## Symbol - if (length(map_shape) == 1) { - map_shape <- match.arg(map_shape, choices = choices[1]) - map_shape <- x[[map_shape]] - } - pch <- scale_symbole(x = map_shape, n = n, symb = list(...)$pch, - default = graphics::par("pch")) + pch <- scale_symbole(x = highlight, symb = pch) ## Size - if (length(map_size) == 1) { - map_size <- match.arg(map_size, choices = choices[c(2, 3, 4, 5)]) - map_size <- x[[map_size]] - } - cex <- scale_size(x = map_size, n, size = list(...)$cex, - default = graphics::par("cex")) + cex <- scale_size(x = highlight, size = cex) ## Line type - if (length(map_linetype) == 1) { - map_linetype <- match.arg(map_linetype, choices = choices[1]) - map_linetype <- x[[map_linetype]] - } - lty <- scale_symbole(x = map_linetype, n = n, symb = list(...)$lty, - default = graphics::par("lty")) + lty <- scale_symbole(x = highlight, symb = lty) ## Line width - if (length(map_linewidth) == 1) { - map_linewidth <- match.arg(map_linewidth, choices = choices[c(2, 3, 4, 5)]) - map_linewidth <- x[[map_linewidth]] - } - lwd <- scale_size(x = map_linewidth, n = n, size = list(...)$lwd, - default = graphics::par("lwd")) - - data.frame(col = col, pch = pch, cex = cex, lty = lty, lwd = lwd) -} - -#' Rescale Continuous Vector -#' -#' Rescales continuous vector to have specified minimum and maximum. -#' @param x A continuous `vector` of values to manipulate. -#' @param to A length-two [`numeric`] vector specifying the output range. -#' @param from A length-two [`numeric`] vector specifying the input range. -#' @return A [`numeric`] vector. -#' @keywords internal -#' @noRd -scale_range <- function(x, to = c(0, 1), from = range(x, na.rm = TRUE, finite = TRUE)) { - (x - from[1]) / diff(from) * diff(to) + to[1] + lwd <- scale_size(x = highlight, size = lwd) + + param <- data.frame( + col = col, + bg = bg, + pch = pch, + cex = cex, + lty = lty, + lwd = lwd + ) + if (nrow(param) > n) param <- param[seq_len(n), , drop = FALSE] + param } -scale_color <- function(x, n = length(x), col = NULL, alpha = FALSE) { +scale_color <- function(x, col = NULL, alpha = FALSE) { if (is.null(x)) { - col <- rep_len(col %||% graphics::par("col"), n) + if (is.null(col)) col <- graphics::par("col") return(col) } if (is.double(x)) { ## Continuous scale - if (is.null(col)) - col <- grDevices::hcl.colors(12, "YlOrRd", rev = TRUE) + if (is.null(col)) col <- grDevices::hcl.colors(12, "YlOrRd", rev = TRUE) x <- scale_range(x) # Rescale to [0,1] col <- grDevices::colorRamp(col)(x) col <- grDevices::rgb(col[, 1], col[, 2], col[, 3], maxColorValue = 255) @@ -401,40 +388,33 @@ scale_color <- function(x, n = length(x), col = NULL, alpha = FALSE) { } else { ## Discrete scale n_col <- length(unique(x)) - if (is.null(col)) - col <- grDevices::hcl.colors(n_col, "viridis") + if (is.null(col)) col <- grDevices::hcl.colors(n_col, "viridis") col <- recycle(col, n_col) col <- col[as.factor(x)] } col } -scale_symbole <- function(x, n = length(x), symb = NULL, default = 1) { - if (is.null(x)) { - symb <- rep_len(symb %||% default, n) - return(symb) - } - - if (is.double(x)) { # Continuous scale +scale_symbole <- function(x, symb = NULL, what = "pch") { + if (is.double(x) && length(symb) > 1) { warning("Continuous value supplied to discrete scale.", call. = FALSE) } + if (is.null(symb)) symb <- graphics::par(what) + if (is.null(x)) return(symb) + n_symb <- length(unique(x)) - if (is.null(symb)) symb <- seq_len(n_symb) symb <- recycle(symb, n_symb) symb <- symb[as.factor(x)] symb } -scale_size <- function(x, n = length(x), size = NULL, default = 1) { - if (is.null(x)) { - size <- rep_len(size %||% default, n) +scale_size <- function(x, size = NULL, what = "cex") { + if (is.null(size)) size <- graphics::par(what) + if (!is.double(x)) { + if (length(size) > 1) + warning("Discrete value supplied to continuous scale.", call. = FALSE) return(size) } - if (!is.double(x)) { # Discrete scale - warning("Discrete value supplied to continuous scale.", call. = FALSE) - } - - if (is.null(size)) size <- default + x / max(x) - size + scale_range(x, to = range(size)) } diff --git a/R/viz_labels.R b/R/viz_labels.R index fd4617c..0b59f0d 100644 --- a/R/viz_labels.R +++ b/R/viz_labels.R @@ -3,7 +3,6 @@ NULL viz_labels <- function(x, y, labels = seq_along(x), - xlim = c(-Inf, Inf), ylim = c(-Inf, Inf), box = FALSE, segment = FALSE, cex = graphics::par("cex"), col = graphics::par("fg"), bg = graphics::par("bg"), ...) { diff --git a/README.Rmd b/README.Rmd index e8c025e..5b9eb86 100644 --- a/README.Rmd +++ b/README.Rmd @@ -112,7 +112,7 @@ biplot(X, type = "form") ## Highlight species viz_individuals( x = X, - map_color = iris$Species, + highlight = iris$Species, col = khroma::color("high contrast")(3), pch = 16 ) @@ -127,9 +127,9 @@ viz_tolerance( ## Highlight petal length viz_individuals( x = X, - map_color = iris$Petal.Length, - map_size = iris$Petal.Length, + highlight = iris$Petal.Length, col = khroma::color("iridescent")(255), + cex = c(1, 2), pch = 16 ) ``` diff --git a/README.md b/README.md index 83ef10e..afb01f2 100644 --- a/README.md +++ b/README.md @@ -156,7 +156,7 @@ biplot(X, type = "form") ## Highlight species viz_individuals( x = X, - map_color = iris$Species, + highlight = iris$Species, col = khroma::color("high contrast")(3), pch = 16 ) @@ -171,9 +171,9 @@ viz_tolerance( ## Highlight petal length viz_individuals( x = X, - map_color = iris$Petal.Length, - map_size = iris$Petal.Length, + highlight = iris$Petal.Length, col = khroma::color("iridescent")(255), + cex = c(1, 2), pch = 16 ) ``` diff --git a/inst/examples/ex-plot.R b/inst/examples/ex-plot.R index f59d38e..e548999 100644 --- a/inst/examples/ex-plot.R +++ b/inst/examples/ex-plot.R @@ -5,13 +5,32 @@ data("iris") X <- pca(iris, scale = TRUE) ## Plot individuals -viz_individuals(X, map_color = iris$Species, map_shape = iris$Species) +viz_individuals(X, panel.last = graphics::grid()) -viz_individuals(X, map_color = iris$Sepal.Width, map_size = "cos2") +## Plot variables +viz_variables(X, panel.last = graphics::grid()) -viz_individuals(X, map_color = "contrib", map_size = "contrib", pch = 16) +## Graphical parameters +## Continuous values +viz_individuals(X, highlight = iris$Petal.Length, pch = 16) +viz_individuals(X, highlight = iris$Petal.Length, pch = 16, + col = grDevices::hcl.colors(12, "RdPu")) +viz_individuals(X, highlight = iris$Petal.Length, pch = 16, + col = grDevices::hcl.colors(12, "RdPu"), + cex = c(1, 2)) + +viz_variables(X, highlight = "contribution", + col = grDevices::hcl.colors(12, "BluGrn", rev = TRUE), + lwd = c(1, 5)) + +## Discrete values +viz_individuals(X, highlight = iris$Species, pch = 21:23) +viz_individuals(X, highlight = iris$Species, pch = 21:23, + bg = c("#004488", "#DDAA33", "#BB5566"), + col = "black") + +viz_variables(X, highlight = c("Petal", "Petal", "Sepal", "Sepal"), + col = c("#EE7733", "#0077BB"), + lty = c(1, 3)) -## Plot variables -viz_variables(X) -viz_variables(X, map_color = "contribution") diff --git a/inst/examples/ex-wrap.R b/inst/examples/ex-wrap.R index 1b0e1b2..ddb280e 100644 --- a/inst/examples/ex-wrap.R +++ b/inst/examples/ex-wrap.R @@ -15,6 +15,6 @@ conf <- wrap_confidence(X, margin = 1, group = iris$Species, conf <- wrap_confidence(X, margin = 1, group = iris$Species, level = 0.95) ## Plot with convex hulls -col <- c(blue = "#004488", yellow = "#DDAA33", red = "#BB5566") -viz_rows(X, map_color = iris$Species, col = col) +col <- c("#004488", "#DDAA33", "#BB5566") +viz_rows(X, highlight = iris$Species, col = col) viz_hull(X, group = iris$Species, border = col) diff --git a/inst/tinytest/_tinysnapshot/CA_boot_col.svg b/inst/tinytest/_tinysnapshot/CA_boot_col.svg index a6e1550..960f1d8 100644 --- a/inst/tinytest/_tinysnapshot/CA_boot_col.svg +++ b/inst/tinytest/_tinysnapshot/CA_boot_col.svg @@ -30,191 +30,129 @@ - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + diff --git a/inst/tinytest/_tinysnapshot/CA_boot_row.svg b/inst/tinytest/_tinysnapshot/CA_boot_row.svg index 25b87b7..8401494 100644 --- a/inst/tinytest/_tinysnapshot/CA_boot_row.svg +++ b/inst/tinytest/_tinysnapshot/CA_boot_row.svg @@ -30,191 +30,129 @@ - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + diff --git a/inst/tinytest/_tinysnapshot/PCA_boot_col.svg b/inst/tinytest/_tinysnapshot/PCA_boot_col.svg index 3832eb9..7805f3a 100644 --- a/inst/tinytest/_tinysnapshot/PCA_boot_col.svg +++ b/inst/tinytest/_tinysnapshot/PCA_boot_col.svg @@ -30,192 +30,130 @@ - - - - + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - - - - - + + + - + diff --git a/inst/tinytest/_tinysnapshot/PCA_var_group_cat.svg b/inst/tinytest/_tinysnapshot/PCA_var_group_cat.svg index 716f85e..ca8c657 100644 --- a/inst/tinytest/_tinysnapshot/PCA_var_group_cat.svg +++ b/inst/tinytest/_tinysnapshot/PCA_var_group_cat.svg @@ -31,14 +31,14 @@ - - - - - - - - + + + + + + + + diff --git a/inst/tinytest/_tinysnapshot/PCA_var_highlight_contrib.svg b/inst/tinytest/_tinysnapshot/PCA_var_highlight_contrib.svg index 6e60423..e1c85a2 100644 --- a/inst/tinytest/_tinysnapshot/PCA_var_highlight_contrib.svg +++ b/inst/tinytest/_tinysnapshot/PCA_var_highlight_contrib.svg @@ -30,156 +30,156 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inst/tinytest/test_plot_ca.R b/inst/tinytest/test_plot_ca.R index fb51a7d..d0f3fe3 100644 --- a/inst/tinytest/test_plot_ca.R +++ b/inst/tinytest/test_plot_ca.R @@ -14,13 +14,11 @@ if (at_home()) { for (i in c(TRUE, FALSE)) { for (j in c(TRUE, FALSE)) { plot_row <- function() viz_rows(res, axes = c(1, 2), active = i, sup = j, - map_color = "observation", - map_shape = "observation") + highlight = "observation", pch = c(1, 2)) expect_snapshot_plot(plot_row, sprintf("CA_row_%d-%d", i, j)) plot_col <- function() viz_columns(res, axes = c(1, 2), active = i, sup = j, - map_color = "observation", - map_shape = "observation") + highlight = "observation", pch = c(1, 2)) expect_snapshot_plot(plot_col, sprintf("CA_col_%d-%d", i, j)) } } diff --git a/inst/tinytest/test_plot_pca.R b/inst/tinytest/test_plot_pca.R index 504e7cb..4caea93 100644 --- a/inst/tinytest/test_plot_pca.R +++ b/inst/tinytest/test_plot_pca.R @@ -15,8 +15,7 @@ if (at_home()) { for (i in c(TRUE, FALSE)) { for (j in c(TRUE, FALSE)) { plot_ind <- function() viz_individuals(res, axes = c(1, 2), active = i, sup = j, - map_color = "observation", - map_shape = "observation") + highlight = "observation", pch = c(1, 2)) expect_snapshot_plot(plot_ind, sprintf("PCA_ind_%d-%d", i, j)) } } @@ -26,8 +25,8 @@ if (at_home()) { plot_var <- function() viz_variables(res, axes = c(1, 2), active = i, sup = j, labels = FALSE, - map_color = "observation", - map_linetype = "observation") + highlight = "observation", + lty = c(1, 2)) expect_snapshot_plot(plot_var, sprintf("PCA_var_%d-%d", i, j)) } } @@ -36,25 +35,27 @@ if (at_home()) { res <- pca(iris) # Individuals - plot_ind_cos2 <- function() viz_individuals(res, map_color = "cos2") + plot_ind_cos2 <- function() viz_individuals(res, highlight = "cos2") expect_snapshot_plot(plot_ind_cos2, "PCA_ind_highlight_cos2") - plot_ind_contrib <- function() viz_individuals(res, map_size = "contrib") + plot_ind_contrib <- function() viz_individuals(res, highlight = "contrib", + cex = c(1, 2)) expect_snapshot_plot(plot_ind_contrib, "PCA_var_highlight_contrib") - plot_ind_group <- function() viz_individuals(res, map_color = iris$Species, - map_shape = iris$Species) + plot_ind_group <- function() viz_individuals(res, highlight = iris$Species, + pch = c(1, 2, 3)) expect_snapshot_plot(plot_ind_group, "PCA_ind_group") # Variables group_num <- c(1, 2, 3, 4) plot_var_group_num <- function() viz_variables(res, labels = FALSE, - map_color = group_num) + highlight = group_num) expect_snapshot_plot(plot_var_group_num, "PCA_var_group_num") group_cat <- c("Sepal", "Sepal", "Petal", "Petal") plot_var_group_cat <- function() viz_variables(res, labels = FALSE, - map_linetype = group_cat) + highlight = group_cat, + lty = c(1, 2)) expect_snapshot_plot(plot_var_group_cat, "PCA_var_group_cat") # PCA - Plot eigenvalues ===================================================== diff --git a/inst/tinytest/test_scale.R b/inst/tinytest/test_scale.R index 3c097a7..8200ec0 100644 --- a/inst/tinytest/test_scale.R +++ b/inst/tinytest/test_scale.R @@ -6,13 +6,15 @@ xcha <- c("A", "B", "C", "D", "E") expect_identical(dimensio:::scale_range(5:10), c(0, 0.2, 0.4, 0.6, 0.8, 1)) # Color scale ================================================================== -expect_identical( - dimensio:::scale_color(x = NULL, n = 5, col = "red"), - c("red", "red", "red", "red", "red") -) +expect_identical(dimensio:::scale_color(x = NULL, col = NULL), graphics::par("col")) +expect_identical(dimensio:::scale_color(x = NULL, col = "red"), "red") ## Continuous scale ------------------------------------------------------------ expect_length(dimensio:::scale_color(xcont), 6L) +expect_identical( + dimensio:::scale_color(xcont, col = "#000000"), + c("#000000", "#000000", "#000000", "#000000", "#000000", "#000000") +) ## Default palette expect_identical( @@ -46,50 +48,61 @@ expect_equivalent( ) ## Recycle -expect_message(dimensio:::scale_color(xint, col = "black")) +expect_message(dimensio:::scale_color(xint, col = c("black", "red"))) expect_identical( - suppressMessages(dimensio:::scale_color(xint, col = "black")), + suppressMessages(dimensio:::scale_color(xint, col = c("black", "red"))), + c("black", "red", "black", "red", "black") +) +expect_identical( + dimensio:::scale_color(xint, col = "black"), c("black", "black", "black", "black", "black") ) # Shape scale ================================================================== expect_identical( - dimensio:::scale_symbole(x = NULL, n = 5, symb = NULL, default = 16), - c(16, 16, 16, 16, 16) + dimensio:::scale_symbole(x = NULL, symb = NULL, what = "pch"), + graphics::par("pch") ) +expect_identical( + dimensio:::scale_symbole(x = NULL, symb = NULL, what = "lty"), + graphics::par("lty") +) +expect_identical(dimensio:::scale_symbole(x = NULL, symb = 16), 16) -expect_length(dimensio:::scale_symbole(xint), 5L) +expect_identical(dimensio:::scale_symbole(xint), c(1L, 1L, 1L, 1L, 1L)) expect_identical(dimensio:::scale_symbole(xint), dimensio:::scale_symbole(xcha)) -expect_identical(dimensio:::scale_symbole(xint, symb = NULL, default = 1), 1:5) -expect_identical(dimensio:::scale_symbole(xint, symb = 15:19, default = 1), 15:19) +expect_identical(dimensio:::scale_symbole(xint, symb = 15:19), 15:19) -expect_message(dimensio:::scale_symbole(xint, symb = 16)) +expect_message(dimensio:::scale_symbole(xint, symb = c(15, 16))) +expect_identical( + suppressMessages(dimensio:::scale_symbole(xint, symb = c(15, 16))), + c(15, 16, 15, 16, 15) +) expect_identical( - suppressMessages(dimensio:::scale_symbole(xint, symb = 16)), + dimensio:::scale_symbole(xint, symb = 16), c(16, 16, 16, 16, 16) ) expect_warning( - dimensio:::scale_symbole(xcont), + dimensio:::scale_symbole(xcont, symb = 15:19), "Continuous value supplied to discrete scale." ) # Size scale =================================================================== expect_identical( - dimensio:::scale_size(x = NULL, n = 5, size = NULL, default = 2), - c(2, 2, 2, 2, 2) + dimensio:::scale_size(x = NULL, size = NULL, what = "cex"), + graphics::par("cex") ) - -expect_length(dimensio:::scale_size(xcont), 6L) - expect_identical( - dimensio:::scale_size(xcont, size = NULL, default = 1), - c(1.5, 1.6, 1.7, 1.8, 1.9, 2) + dimensio:::scale_size(x = NULL, size = NULL, what = "lwd"), + graphics::par("lwd") ) -expect_identical(dimensio:::scale_size(xcont, size = 1:6, default = 1), 1:6) +expect_identical(dimensio:::scale_size(x = NULL, size = 2), 2) + +expect_equal(dimensio:::scale_size(xcont, size = c(1, 6)), c(1, 2, 3, 4, 5, 6)) expect_warning( - dimensio:::scale_size(xint), + dimensio:::scale_size(xint, size = c(1, 6)), "Discrete value supplied to continuous scale." ) diff --git a/man/figures/README-biplot-1.png b/man/figures/README-biplot-1.png index 9b3fd3eb0838d2ab0e82eb476d075bda515dddab..5664b00b967360b1c4618d12d9a88f20d4df1ad0 100644 GIT binary patch literal 23733 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 NhPzC5rt8~W_%C0Q3IhND literal 23677 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 diff --git a/man/figures/README-plot-var-1.png b/man/figures/README-plot-var-1.png index dce53f502da7eb0b762a76d620bd3227b7cd6b19..588829c96276970bc15828a6809706de0e22cc2c 100644 GIT binary patch delta 16324 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 Y)${Cv&x+a4kTXG1l2?+}q5uE@ delta 16304 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 diff --git a/man/viz_individuals.Rd b/man/viz_individuals.Rd index 24d44c9..ec4baa1 100644 --- a/man/viz_individuals.Rd +++ b/man/viz_individuals.Rd @@ -21,11 +21,11 @@ viz_rows(x, ...) active = TRUE, sup = TRUE, labels = FALSE, - map_color = NULL, - map_shape = NULL, - map_size = NULL, + highlight = NULL, main = NULL, sub = NULL, + panel.first = NULL, + panel.last = NULL, ... ) @@ -37,11 +37,11 @@ viz_rows(x, ...) active = TRUE, sup = TRUE, labels = FALSE, - map_color = NULL, - map_shape = NULL, - map_size = NULL, + highlight = NULL, main = NULL, sub = NULL, + panel.first = NULL, + panel.last = NULL, ... ) } @@ -61,17 +61,24 @@ plotted?} \item{labels}{A \code{\link{logical}} scalar: should labels be drawn?} -\item{map_color, map_shape, map_size}{A vector specifying the -information to be highlighted. It will be mapped to the corresponding -aesthetic (see examples and vignettes). +\item{highlight}{A vector specifying the information to be highlighted. +If \code{NULL} (the default), no highlighting is applied. +It will only be mapped if at least one \link[graphics:par]{graphical parameters} +is explicitly specified (see examples). If a single \code{character} string is passed, it must be one of "\code{observation}", -"\code{mass}", "\code{sum}", "\code{contribution}" or "\code{cos2}" (see details). -Any unambiguous substring can be given. -If \code{NULL} (the default), no highlighting is applied.} +"\code{mass}", "\code{sum}", "\code{contribution}" or "\code{cos2}" (see \code{\link[=augment]{augment()}}). +Any unambiguous substring can be given.} \item{main}{A \code{\link{character}} string giving a main title for the plot.} \item{sub}{A \code{\link{character}} string giving a subtitle for the plot.} + +\item{panel.first}{An an \code{expression} to be evaluated after the plot axes are +set up but before any plotting takes place. This can be useful for drawing +background grids.} + +\item{panel.last}{An \code{expression} to be evaluated after plotting has taken +place but before the axes, title and box are added.} } \value{ \verb{viz_*()} is called for its side-effects: it results in a graphic @@ -81,24 +88,22 @@ being displayed. Invisibly returns \code{x}. Plots row/individual principal coordinates. } \details{ -Available statistics: -\describe{ -\item{\code{observation}}{Whether an observation is active or supplementary.} -\item{\code{mass}}{Weight/mass of each observation.} -\item{\code{sum}}{Sum of squared coordinates along \code{axes}.} -\item{\code{contribution}}{Joint contributions to the definition of \code{axes}.} -\item{\code{cos2}}{Joint \eqn{cos^2}{cos2} along \code{axes}.} -} - Commonly used \link[graphics:par]{graphical parameters} are: \describe{ -\item{\code{col}}{The colors for lines and points. Multiple colors can be -specified so that each point can be given its own color.} -\item{\code{pch}}{A vector of plotting characters or symbols.} +\item{\code{pch}}{A vector of plotting characters or symbols. This can either be +a single character or an integer code for one of a set of +graphics symbols.} \item{\code{cex}}{A numerical vector giving the amount by which plotting characters and symbols should be scaled relative to the default.} +\item{\code{col}}{The colors for lines and points. Multiple colors can be +specified so that each point can be given its own color.} +\item{\code{bg}}{The background color for the open plot symbols given by +\code{pch = 21:25}.} +} } +\note{ +Be careful: graphical parameters are silently recycled. } \examples{ ## Load data @@ -108,16 +113,35 @@ data("iris") X <- pca(iris, scale = TRUE) ## Plot individuals -viz_individuals(X, map_color = iris$Species, map_shape = iris$Species) +viz_individuals(X, panel.last = graphics::grid()) -viz_individuals(X, map_color = iris$Sepal.Width, map_size = "cos2") +## Plot variables +viz_variables(X, panel.last = graphics::grid()) -viz_individuals(X, map_color = "contrib", map_size = "contrib", pch = 16) +## Graphical parameters +## Continuous values +viz_individuals(X, highlight = iris$Petal.Length, pch = 16) +viz_individuals(X, highlight = iris$Petal.Length, pch = 16, + col = grDevices::hcl.colors(12, "RdPu")) +viz_individuals(X, highlight = iris$Petal.Length, pch = 16, + col = grDevices::hcl.colors(12, "RdPu"), + cex = c(1, 2)) + +viz_variables(X, highlight = "contribution", + col = grDevices::hcl.colors(12, "BluGrn", rev = TRUE), + lwd = c(1, 5)) + +## Discrete values +viz_individuals(X, highlight = iris$Species, pch = 21:23) +viz_individuals(X, highlight = iris$Species, pch = 21:23, + bg = c("#004488", "#DDAA33", "#BB5566"), + col = "black") + +viz_variables(X, highlight = c("Petal", "Petal", "Sepal", "Sepal"), + col = c("#EE7733", "#0077BB"), + lty = c(1, 3)) -## Plot variables -viz_variables(X) -viz_variables(X, map_color = "contribution") } \seealso{ Other plot methods: diff --git a/man/viz_variables.Rd b/man/viz_variables.Rd index e02e566..373ce31 100644 --- a/man/viz_variables.Rd +++ b/man/viz_variables.Rd @@ -22,11 +22,11 @@ viz_columns(x, ...) active = TRUE, sup = TRUE, labels = FALSE, - map_color = NULL, - map_shape = NULL, - map_size = NULL, + highlight = NULL, main = NULL, sub = NULL, + panel.first = NULL, + panel.last = NULL, ... ) @@ -38,11 +38,11 @@ viz_columns(x, ...) active = TRUE, sup = TRUE, labels = TRUE, - map_color = NULL, - map_linetype = NULL, - map_linewidth = NULL, + highlight = NULL, main = NULL, sub = NULL, + panel.first = NULL, + panel.last = NULL, ... ) @@ -64,17 +64,24 @@ plotted?} \item{labels}{A \code{\link{logical}} scalar: should labels be drawn?} -\item{map_color, map_shape, map_size, map_linetype, map_linewidth}{A vector -specifying the information to be highlighted. It will be mapped to the -corresponding aesthetic (see examples and vignettes). +\item{highlight}{A vector specifying the information to be highlighted. +If \code{NULL} (the default), no highlighting is applied. +It will only be mapped if at least one \link[graphics:par]{graphical parameters} +is explicitly specified (see examples). If a single \code{character} string is passed, it must be one of "\code{observation}", -"\code{mass}", "\code{sum}", "\code{contribution}" or "\code{cos2}" (see details). -Any unambiguous substring can be given. -If \code{NULL} (the default), no highlighting is applied.} +"\code{mass}", "\code{sum}", "\code{contribution}" or "\code{cos2}" (see \code{\link[=augment]{augment()}}). +Any unambiguous substring can be given.} \item{main}{A \code{\link{character}} string giving a main title for the plot.} \item{sub}{A \code{\link{character}} string giving a subtitle for the plot.} + +\item{panel.first}{An an \code{expression} to be evaluated after the plot axes are +set up but before any plotting takes place. This can be useful for drawing +background grids.} + +\item{panel.last}{An \code{expression} to be evaluated after plotting has taken +place but before the axes, title and box are added.} } \value{ \verb{viz_*()} is called for its side-effects: it results in a graphic @@ -84,26 +91,24 @@ being displayed. Invisibly returns \code{x}. Plots column/variable principal coordinates. } \details{ -Available statistics: -\describe{ -\item{\code{observation}}{Whether an observation is active or supplementary.} -\item{\code{mass}}{Weight/mass of each observation.} -\item{\code{sum}}{Sum of squared coordinates along \code{axes}.} -\item{\code{contribution}}{Joint contributions to the definition of \code{axes}.} -\item{\code{cos2}}{Joint \eqn{cos^2}{cos2} along \code{axes}.} -} - Commonly used \link[graphics:par]{graphical parameters} are: \describe{ -\item{\code{col}}{The colors for lines and points. Multiple colors can be -specified so that each point can be given its own color.} -\item{\code{pch}}{A vector of plotting characters or symbols.} +\item{\code{pch}}{A vector of plotting characters or symbols. This can either be +a single character or an integer code for one of a set of +graphics symbols.} \item{\code{cex}}{A numerical vector giving the amount by which plotting characters and symbols should be scaled relative to the default.} \item{\code{lty}}{A vector of line types.} \item{\code{lwd}}{A vector of line widths.} +\item{\code{col}}{The colors for lines and points. Multiple colors can be +specified so that each point can be given its own color.} +\item{\code{bg}}{The background color for the open plot symbols given by +\code{pch = 21:25}.} +} } +\note{ +Be careful: graphical parameters are silently recycled. } \examples{ ## Load data @@ -113,16 +118,35 @@ data("iris") X <- pca(iris, scale = TRUE) ## Plot individuals -viz_individuals(X, map_color = iris$Species, map_shape = iris$Species) +viz_individuals(X, panel.last = graphics::grid()) -viz_individuals(X, map_color = iris$Sepal.Width, map_size = "cos2") +## Plot variables +viz_variables(X, panel.last = graphics::grid()) -viz_individuals(X, map_color = "contrib", map_size = "contrib", pch = 16) +## Graphical parameters +## Continuous values +viz_individuals(X, highlight = iris$Petal.Length, pch = 16) +viz_individuals(X, highlight = iris$Petal.Length, pch = 16, + col = grDevices::hcl.colors(12, "RdPu")) +viz_individuals(X, highlight = iris$Petal.Length, pch = 16, + col = grDevices::hcl.colors(12, "RdPu"), + cex = c(1, 2)) + +viz_variables(X, highlight = "contribution", + col = grDevices::hcl.colors(12, "BluGrn", rev = TRUE), + lwd = c(1, 5)) + +## Discrete values +viz_individuals(X, highlight = iris$Species, pch = 21:23) +viz_individuals(X, highlight = iris$Species, pch = 21:23, + bg = c("#004488", "#DDAA33", "#BB5566"), + col = "black") + +viz_variables(X, highlight = c("Petal", "Petal", "Sepal", "Sepal"), + col = c("#EE7733", "#0077BB"), + lty = c(1, 3)) -## Plot variables -viz_variables(X) -viz_variables(X, map_color = "contribution") } \seealso{ Other plot methods: diff --git a/man/viz_wrap.Rd b/man/viz_wrap.Rd index ba1512a..097f55c 100644 --- a/man/viz_wrap.Rd +++ b/man/viz_wrap.Rd @@ -78,8 +78,8 @@ conf <- wrap_confidence(X, margin = 1, group = iris$Species, conf <- wrap_confidence(X, margin = 1, group = iris$Species, level = 0.95) ## Plot with convex hulls -col <- c(blue = "#004488", yellow = "#DDAA33", red = "#BB5566") -viz_rows(X, map_color = iris$Species, col = col) +col <- c("#004488", "#DDAA33", "#BB5566") +viz_rows(X, highlight = iris$Species, col = col) viz_hull(X, group = iris$Species, border = col) } \seealso{ diff --git a/man/wrap.Rd b/man/wrap.Rd index 8b4aff1..a4d26b8 100644 --- a/man/wrap.Rd +++ b/man/wrap.Rd @@ -74,8 +74,8 @@ conf <- wrap_confidence(X, margin = 1, group = iris$Species, conf <- wrap_confidence(X, margin = 1, group = iris$Species, level = 0.95) ## Plot with convex hulls -col <- c(blue = "#004488", yellow = "#DDAA33", red = "#BB5566") -viz_rows(X, map_color = iris$Species, col = col) +col <- c("#004488", "#DDAA33", "#BB5566") +viz_rows(X, highlight = iris$Species, col = col) viz_hull(X, group = iris$Species, border = col) } \seealso{ diff --git a/vignettes/pca.Rmd b/vignettes/pca.Rmd index a49a9be..59d2823 100644 --- a/vignettes/pca.Rmd +++ b/vignettes/pca.Rmd @@ -104,7 +104,7 @@ viz_variables(X) ## Highlight cos2 viz_variables( x = X, - map_color = "cos2", + highlight = "cos2", col = khroma::color("YlOrBr")(4, range = c(0.5, 1)) ) ``` @@ -117,8 +117,7 @@ viz_variables( ## Plot individuals and color by species viz_individuals( x = X, - map_color = iris$Species, - map_shape = iris$Species, + highlight = iris$Species, col = khroma::color("bright")(3), # Custom color scale pch = c(15, 16, 17) # Custom symbols ) @@ -140,9 +139,9 @@ viz_hull(x = X, group = iris$Species, level = 0.95, ## Highlight petal length viz_individuals( x = X, - map_color = iris$Petal.Length, - map_size = iris$Petal.Length, + highlight = iris$Petal.Length, col = khroma::color("YlOrBr")(12), # Custom color scale + cex = c(1, 2), # Custom size scale pch = 16 ) ``` @@ -151,9 +150,9 @@ viz_individuals( ## Highlight contributions viz_individuals( x = X, - map_color = "contrib", - map_size = "contrib", + highlight = "contrib", col = khroma::color("iridescent")(12), # Custom color scale + cex = c(1, 2), # Custom size scale pch = 16 ) ```