# a version of qqplot() that thins out points that overplot

### Description

QQ-plots with large numbers of points typically generate graphics files that are unhelpfully large. This function handles the problem by removing points that are, for all practical purposes, redundant

### Usage

1 2 3 |

### Arguments

`x` |
ordered values of |

`y` |
ordered values of |

`ends` |
outside these cumulative proportions of numbers of points, all points will be included in the graph |

`eps` |
controls the extent of overplotting |

`xlab` |
label for x-axis |

`adj.xlab` |
positioning of x-label |

`ylab` |
label for y-axis |

`show.line` |
logical; show the line y=x? |

`print.thinning.details` |
logical; print number of points after thinning? |

`centerline` |
logical; draw a line though the part of the graph where some points have been omitted? |

`...` |
additional graphics parameters |

### Value

Gives a qqplot. The number of points retained is returned invisibly.

### Author(s)

John Maindonald

### References

~put references to the literature/web site here ~

### Examples

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | ```
mat <- matrix(rnorm(1000), ncol=20)
cl <- factor(rep(1:3, c(7,9,4)))
Fstats <- aovFbyrow(x = mat, cl = cl)
qqthin(qf(ppoints(length(Fstats)), 2, 17), Fstats, eps=0.01)
## The function is currently defined as
function(x, y, ends=c(.01,.99), eps=0.001,
xlab = deparse(substitute(x)), adj.xlab=NULL,
ylab = deparse(substitute(y)), show.line=TRUE,
print.thinning.details=TRUE,
centerline=TRUE, ...){
## qqthin() is a substitute for qqplot(), that thins
## out plotted points from the region where they are
## dense. Apart from the overlaid curve that shows
## the region where points have been thinned, it may
## be hard to distinguish the result of qqthin()
## from that of qqplot()
xlab <- xlab
ylab <- ylab
x <- sort(x)
y <- sort(y)
dx<-diff(x)
epsdist <- sqrt(diff(range(x))^2+diff(range(y))^2)*eps
dx<-0.5*(c(dx[1],dx)+c(dx,dx[length(dx)]))
dy<-diff(y)
dy<-0.5*(c(dy[1],dy)+c(dy,dy[length(dy)]))
dpoints <- epsdist/sqrt(dx^2+dy^2)
## dpoints is a local measure of the number of points
## per unit distance along the diagonal, with the unit
## set to approximately eps*(length of diagonal)
dig<-floor(dpoints)+1
## dig is, roughly, the number of points per unit distance.
## We wish to retain one point per unit distance. For this
## retain points where cdig rounds to an integer. For such
## points, cdig has increased by approx 1, relative to the
## previous point that is retained.
cdig<-round(cumsum(1/dig))
subs<-match(unique(cdig), cdig)
if(is.null(adj.xlab))
plot(x[subs], y[subs], xlab=xlab, ylab=ylab)
else {
plot(x[subs], y[subs], xlab="", ylab=ylab)
mtext(side=1, xlab, adj=adj.xlab, line=par()$mgp[1])
}
if(any(diff(subs)>1)){
n1 <- min(subs[c(diff(subs),0)>1])
n2 <- max(subs[c(0,diff(subs))>1])
ns1 <- match(n1, subs)
ns2 <- match(n2, subs)
if(print.thinning.details)
print(paste("Graph retains", length(subs), "points."))
if(centerline)
lines(smooth.spline(x[subs[ns1:ns2]], y[subs[ns1:ns2]]),
col="grey", lwd=2)
}
if(show.line)abline(0, 1, col="red")
invisible(length(subs))
}
``` |