[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