# File src/library/graphics/R/plot.design.R # Part of the R package, http://www.R-project.org # # Copyright (C) 1995-2014 The R Core Team # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ plot.design <- function(x, y = NULL, fun = mean, data = NULL, ..., ylim = NULL, xlab = "Factors", ylab = NULL, main = NULL, ask = NULL, xaxt = par("xaxt"), axes = TRUE, xtick = FALSE) { .plot.des <- function(x, y, fun, ylab, ylim = NULL, ...) { ## Arguments: x : data.frame with only factor columns ## y : one numeric vector if(!is.numeric(y)) stop("'y' must be a numeric vector") if(!is.data.frame(x)) # or allow factor (see 2 lines below)?? {FIXME} stop("'x' must be a data frame") if(!all(sapply(x, is.factor)) & !is.factor(x)) # incl "ordered" stop("all columns/components of 'x' must be factors") k <- ncol(x) if(anyNA(y)) { FUN <- fun; fun <- function(u) FUN(u [!is.na(u)]) } tot <- fun(y) stats <- lapply(x, function(xc) tapply(y, xc, fun)) if(any(is.na(unlist(stats)))) warning("some levels of the factors are empty", call. = FALSE) if(is.null(ylim)) ylim <- range(c(sapply(stats,range,na.rm = TRUE),tot)) plot(c(0,k+1), ylim, type = "n", axes = axes, xaxt = "n", xlab = xlab, ylab = ylab, main = main, adj = 0.5, ...) segments(0.5, tot, k+0.5, tot, ...) for(i in 1L:k) { si <- stats[[i]] segments(i, min(si, na.rm = TRUE), i, max(si, na.rm = TRUE), ...) for(j in 1L:(length(si))) { sij <- si[j] segments(i-0.05, sij, i+0.05, sij, ...) text(i-0.1, sij, labels = names(sij), adj = 1, ...) } } if(axes && xaxt != "n") axis(1, at = 1L:k, names(stats), xaxt = xaxt, tick = xtick, mgp = {p <- par("mgp"); c(p[1L], if(xtick) p[2L] else 0, 0)}, ...) } ## .plot.des() ## 'fun' dealing fname <- deparse(substitute(fun)) fun <- match.fun(fun) if (!(is.data.frame(x) | inherits(x,"formula"))) stop("'x' must be a dataframe or a formula") ## case 'switch' : if(is.data.frame(x)) { if(is.null(y)) { ## nothing to do } else if(inherits(y,"formula")) { x <- stats::model.frame(y , data = x) } else if(is.numeric(y)) { x <- cbind(y,x[,sapply(x, is.factor)]) tmpname <- match.call() names(x) <- as.character(c(tmpname[[3L]],names(x[,-1]))) } else if(is.character(y)) { ynames <- y y <- data.frame(x[,y]) if(sum(sapply(y, is.numeric)) != ncol(y)) { stop("a variable in 'y' is not numeric") } x <- x[,sapply(x, is.factor)] xnames <- names(x) x <- cbind(x,y) names(x) <- c(xnames,ynames) } } else if (is.data.frame(data)) { x <- stats::model.frame(x , data = data) } else { x <- stats::model.frame(x) } i.fac <- sapply(x, is.factor) i.num <- sapply(x, is.numeric) nResp <- sum(i.num) if (nResp == 0) stop("there must be at least one numeric variable!") yname <- names(x)[i.num] if(is.null(ylab)) ylab <- paste(fname, "of", yname) ydata <- as.matrix(x[,i.num]) if (!any(i.fac)) { x <- data.frame(Intercept = rep.int(" ", nrow(x))) i.fac <- 1 } xf <- x[, i.fac, drop = FALSE] if (is.null(ask)) ask <- prod(par("mfcol")) < nResp && dev.interactive(orNone = TRUE) if (ask) { oask <- devAskNewPage(ask) on.exit(devAskNewPage(oask)) } for(j in 1L:nResp) .plot.des(xf, ydata[,j], fun = fun, ylab = ylab[j], ylim = ylim, ...) invisible() }