Skip to content

Dot plot - equivalent of MINITAB

6 messages · kerfuffle, Charilaos Skiadas, Rolf Turner +3 more

#
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).

thanks! (and apologies if I've missed something blatant)

Paul
#
I think the problem is that what you describe is not what some  
people, R folks included, refer to as "dotplot", though I suppose  
wikipedia as well as some other top google links seem to agree with  
you and minitab. What you describe I think can be obtained with  
something like:

x<- c(6,6,4,4,4,4,2,2,2,2,2,10)
cnt <- table(x)
xs <- rep(as.numeric(names(cnt)), cnt)
ys <- do.call("c", sapply(cnt, function(x) 1:x))
plot(xs,ys, pch=19, ylim=c(0,10))

The R-dotplot you can think of, if you want, as a replacement of a  
barchart, which replaces the entire bar with a single dot where the  
bar would end. It can also be used when the scale you are using has  
nothing to do with counts, and doesn't even have to start from 0. But  
I am far from an expert, and I am sure/hope a bunch of people will  
jump in to correct me.

There are surely other descriptions of dotplots, but you could start  
with these:

http://www.processtrends.com/pg_charts_dot_plots.htm
http://www.b-eye-network.com/view/2468

Haris Skiadas
Department of Mathematics and Computer Science
Hanover College
On Sep 25, 2008, at 3:51 PM, kerfuffle wrote:

            
#
On 26/09/2008, at 7:51 AM, kerfuffle wrote:

            
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}}
#
Paul,

Have you tried the dotplot() function in the package epicalc? I think it
does what you want.

Sammy
kerfuffle wrote:
-----
Blay S
KATH
Kumasi, Ghana.
#
Does the 'dots' function in the TeachingDemos package do what you want? (It fits one interpretation of your description, but my minitab is a bit rusty, so not sure).

(The "you" above referring to kerfuffle, not Rolf, for some reason I received the reply, but not the original).

--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow at imail.org
801.408.8111
#
I suggest the panel.dotplot.tb in the HH package.
It is a lattice panel function and therefore works
with standard trellis formulas including conditioning
variables and grouping variables.

library(HH)
example(panel.dotplot.tb)

Since you define what you want in terms of Minitab, I mention
that this is available in the Graphs menu with Rcmdr when you
install the RcmdrPlugin.HH package.

Rich