blob: df02ebc7ae24e1c9b54e599df4c5b0acdd9fda0f [file] [log] [blame]
# File src/library/stats/R/qqnorm.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2012 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
# https://www.R-project.org/Licenses/
qqnorm <- function(y, ...) UseMethod("qqnorm")
qqnorm.default <-
function(y, ylim, main = "Normal Q-Q Plot",
xlab = "Theoretical Quantiles", ylab = "Sample Quantiles",
plot.it = TRUE, datax = FALSE, ...)
{
if(has.na <- any(ina <- is.na(y))) { ## keep NA's in proper places
yN <- y
y <- y[!ina]
}
if(0 == (n <- length(y)))
stop("y is empty or has only NAs")
if (plot.it && missing(ylim))
ylim <- range(y)
x <- qnorm(ppoints(n))[order(order(y))]
if(has.na) {
y <- x; x <- yN; x[!ina] <- y
y <- yN
}
if(plot.it)
if (datax)
plot(y, x, main = main, xlab = ylab, ylab = xlab, xlim = ylim, ...)
else
plot(x, y, main = main, xlab = xlab, ylab = ylab, ylim = ylim, ...)
invisible(if(datax) list(x = y, y = x) else list(x = x, y = y))
}
## Splus also has qqnorm.aov(), qqnorm.aovlist(), qqnorm.maov() ...
qqline <- function(y, datax = FALSE, distribution = qnorm,
probs = c(0.25, 0.75), qtype = 7, ...)
{
stopifnot(length(probs) == 2, is.function(distribution))
y <- quantile(y, probs, names=FALSE, type=qtype, na.rm = TRUE)
x <- distribution(probs)
if (datax) {
slope <- diff(x)/diff(y)
int <- x[1L] - slope*y[1L]
} else {
slope <- diff(y)/diff(x)
int <- y[1L]-slope*x[1L]
}
abline(int, slope, ...)
}