[R] Dot plot - equivalent of MINITAB
Rolf Turner
r.turner at auckland.ac.nz
Thu Sep 25 22:57:19 CEST 2008
On 26/09/2008, at 7:51 AM, kerfuffle wrote:
>
> hi folks,
>
> Bit of a newbie, but I've spent a fair bit of time looking for an
> answer on
> this, with no joy. Can anyone help me?
>
> Dataset: A single column of values in a csv file (eg. 52, 53, 54,
> 85, etc)
>
> Goal: In Minitab, you have what they call a dot plot. It's a
> histogram,
> where a single dot represents a set of identical values (eg. 57,
> 57, 57
> would be one dot). Multiple dots are stacked on top of each other
> (as if
> gravity was affecting them). The advantage is that outliers are
> very visible
> (since a single 155 still gets a single dot). The net effect is a
> rug plot,
> but in the main portion of the plot, not just on the axis.
>
> Tried: I've played with dotchart and dotchart2 with no joy (eg.
> dotchart(nc$bac) (where nc is the dataset and bac is the column
> header).
> They do provide multiple dots (so that ten values of 57 are given 3
> dots)
> but these overlap and aren't arranged in a logical way. Sometimes
> a single
> dot has a large y-value, sometimes it isn't. As a result of this
> non-gravitational effect, it doesn't look like a histogram at all.
> It's
> also strange that the background of the plot is stripy. This
> implies I'm
> doing something very wrong, but don't know what. I had a look at
> the plot
> galleries, and didn't see anything else that looked like what I wanted
> (except the rug plots).
Here's something that will do at least roughly what you want. The
fundamentals of this function were written for me by Barry Rowlingson.
(Thanks Baz!)
dotplot.mtb <- function (x, xlim = NULL, main = NULL, xlab = NULL,
pch = 19,
hist = FALSE, yaxis = FALSE)
{
if (is.null(xlim))
xlim <- range(pretty(range(x)))
if (is.null(main))
main <- ""
if (is.null(xlab))
xlab <- ""
x <- sort(x)
w <- table(x)
mw <- max(w)
w <- unlist(lapply(w, function(n) {
1:n
}))
Nmax <- floor(par()$pin[2]/strheight("o", units = "inches"))
if (mw <= Nmax & !hist) {
plot(range(x, na.rm = TRUE), c(0, 1), type = "n", xlab = "",
ylab = "", xlim = xlim, main = main, axes = FALSE)
par(usr = c(par()$usr[1:2], -Nmax/2, Nmax/2))
y <- strheight("o") * w
points(x, y, pch = pch)
axis(side = 1, pos = 0)
if (yaxis) {
a <- 0
b <- round(Nmax/10)
at <- seq(a, by = b, length = 10)
axis(side = 2, at = at)
}
}
else {
if (hist)
plot(x, w, type = "h", xlab = "", ylab = "", xlim = xlim,
ylim = c(-mw - 1, mw + 1), main = main, axes = FALSE)
else plot(x, w, pch = pch, xlab = "", ylab = "", xlim = xlim,
ylim = c(-mw - 1, mw + 1), main = main, axes = FALSE)
axis(side = 1, pos = -0.02 * mw)
if (yaxis) {
a <- 0
b <- max(1, round(mw/10))
at <- seq(a, by = b, length = 10)
axis(side = 2, at = at)
}
}
}
cheers,
Rolf Turner
######################################################################
Attention:\ This e-mail message is privileged and confid...{{dropped:9}}
More information about the R-help
mailing list