# [R] How to get two y-axises in a bar plot?

Jim Lemon jim at bitwrit.com.au
Wed Jan 30 09:54:17 CET 2008

Gustaf Granath wrote:
> Hi,
> I have measured two response variables (y1, y2) at each treatment level
> (x = 0, 1.5 or 3). Now I would like to show the y1 and y2 against x in a
> bar plot. However, y1 and y2 differ in scale so I need two y-axises, one
> on the left side and one on the right side (and I dont want to
> standardize my responses). This is fairly easy if you want to show
> points,lines etc, but gets more complicated with bars.Although these
> kind of bar graphs are quite common, I have found very limited
> information about how to do them in R. I have been struggling with the
> barplot() command. My problem is that the bars for y1 and y2 end up at
> the same place (blocking each other) and not beside each other when I
> use par(new=TRUE). Is there a way to separate them so y1 and y2 are
> placed beside each other at each x level, or is this easier to do this
> with lattice?? I would also like to add error bars but I guess that
> should not be a problem.
>
Hi Gustaf,
You can get a reasonable display like this:

par(mar=c(5,4,4,4))
barp(rbind(y1,y2),names.arg=c(0,1.5,3),col=2:3,
legend.lab=c("y1","y2"))

If you really want to have two y axes, you could add:

axis(4)

If you want to inflate your y2 values so that they look comparable to
the y1 values, you could do this:

barp(rbind(y1,y2*5),names.arg=c(0,1.5,3),col=2:3,
legend.lab=c("y1","y2"))
axis(2,col=2)
axis(4,at=seq(0,15,by=3),labels=0:5,col=3)

but as others have mentioned, it is not a very good idea.

Jim