Skip to content

dotplots with error bars

5 messages · Colin Wahl, Matthieu Dubois, Jim Lemon

#
Does anyone have any recommendations for producing dotplots with error
bars? Are there packages available for this? I searched far and wide
and cannot find a suitable option.

I am trying to produce publication-quality figures for my thesis
results. Dotplots (Cleveland dotplots) are a much better form of
summarizing barchart-type data. It does not appear that any of the
main plotting packages in r support dotplots with error bars.
Considering the benefit of these plots, I find it difficult to believe
that they have not been fully integrated into R.

I did find a function "dotplots.errors" available here:
http://agrobiol.sggw.waw.pl/~cbcs/articles/CBCS_5_2_2.pdf.

However, I have found this function absurdly difficult to use when
customizing figures (ordering displays properly, or just simple
getting the function to work.)

I've been struggling for the last few hours to figure out the error:
"error using packet 1 sum not meaningful for factors." Unlike other
packages, this function doesnt have a ?dotplots.errors to help guide
troubleshooting. I presume this is a technicality due to the a numeric
variable being identified as a factor. However, I've double checked
that all the numeric columns in the data frame are not factors, and
the error persists.

I'd really prefer not just calling it quits and resorting to
old-school sloppy bar charts, but if thats what I need to do to finish
this in a timely manner, then so be it.

Thank you,
Colin
M.S. candidate
WWU, Biology dept.
#
On 02/13/2012 09:51 AM, Colin Wahl wrote:
Hi Colin,
I am grateful that Marcin Kozak gave plotrix a plug in the paper, and to 
show my gratitude, I'll explain how to use centipede.plot to get the 
illustration in the paper. Assume that you have the data frame shown on 
p70 of the paper:

plant_height<-read.csv("plant_height.csv")

Now, to echo Marcin, let us produce the plot:

library(plotrix)
centipede.plot(t(plant_height[,c(3,2,4)]),
  left.labels=plant_height$group,bg="black",
  right.labels=rep("",13),xlab="Mean plant height (cm) +- SE")

If you want the mean value line:

abline(v=mean(plant_height$est),col="lightgray")

The grid lines are a bit more difficult. You could insert a line into 
the function just after the call to box() to draw grid lines under each dot:

abline(h=1:dim(x)[2],col="lightgray",lty=2)

However, this looks like such a good idea that I will add two arguments 
to the function to do the vertical line(s) and horizontal grid 
automatically, and this option will appear in the next version of plotrix.

Jim
#
Colin Wahl <biowahl <at> gmail.com> writes:
Dear Colin, 

have a look at this page from the R wiki:
http://rwiki.sciviews.org/doku.php?id=tips:graphics-base:errbars

Also, if you want more details on how to do it with ggplot2, 
a very nice graphic package, you can have a look here:
http://wiki.stdout.org/rcookbook/Graphs/Plotting%20means%20and%20error%20bars%20(ggplot
2)/

HTH

Matthieu
2 days later
#
Thank you,
Its looking like your package will work for me. I have two questions.

First, how do I rotate the plot 90 degrees so the group labels are on
the x axis and the response value on the y axis?

Second, I'm having trouble with the group labels. I need to order my
groups into meaningful groups to properly display my data. I used the
sort.segs=FALSE argument expecting it to plot the values in the order
of data in the plant_height matrix.

centipede.plot(t(plant_height[,c(3,2,4)]),
	panel.first=c(abline(h=1: 13 , col="lightgray", lty=2),
abline(v=mean(plant_height$est), col="lightgray")),
	sort.segs=FALSE,
	left.labels=plant_height$group, bg="green",
	right.labels=rep("", 13), xlab="Mean plant height (cm) +- SE")

Not only are the groups not plotted in the order as they appear in the
matrix, but the labels are incorrect. The labels cycle through CA-I,
CAIII, CA-II, in that order.

The plot file is attached.

Colin
On Mon, Feb 13, 2012 at 1:31 AM, Jim Lemon <jim at bitwrit.com.au> wrote:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: plantheight.png
Type: image/png
Size: 28225 bytes
Desc: not available
URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20120215/92b74464/attachment.png>
#
On 02/16/2012 05:22 AM, Colin Wahl wrote:
Hi Colin,
First, I'm mildly amazed that centipede.plot will accept embedded 
function commands like lattice graphics. Unsorted groups are plotted 
starting from the bottom of the plot, so when I call centipede.plot like 
this:

centipede.plot(t(plant_height[,c(3,2,4)]),sort.segs=FALSE,
  left.labels=plant_height$group, bg="green",
  hgrid=1:13,vgrid=mean(plant_height$est),
  right.labels=rep("", 13),
  xlab="Mean plant height (cm) +- SE")

I get what I would expect, except for the fact that in modifying the 
function, I got the wrong dimension of the "segs" matrix to order the 
left.labels, thus the repeating labels. I have fixed that particular bug 
and attached the line that fixes the bug for you. I'll wrap up a new 
package to fix this for others who may use it.

The big problem is that you want an entirely different plot if you turn 
it sideways. What you want in that case is probably:

plot(1:13,plant_height$est,xaxt="n",xlab="Groups",type="n",
  ylab="Mean plant height (cm) +- SE",ylim=c(0,20),
  main="Plant height by group")
abline(v=1:13,col="lightgray",lty=2)
abline(h=mean(plant_height$est),col="lightgray")
points(1:13,plant_height$est,pch=21,bg="green")
dispersion(1:13,plant_height$est,plant_height$upper,plant_height$lower,
  intervals=FALSE)
staxlab(1,at=1:13,labels=plant_height$group)

To fix the label bug, replace this line:

  else seg.order<-1:segdim[1]

with this:

  else seg.order<-1:segdim[2]

Now that's better.

Jim