Homap
Homap

Reputation: 2214

Omitting axes in plot R

I have used the following code in R to generate this graph:

x  <- c(0.916, 0.815, 0.101, -0.029, -0.166, 0.949, 0.073, -0.054, 1.006)
y  <- c(3.91,  5.17,  1.08,   1.28,   1.01,  4.37,  3.97,   0.77,  4.52)
sd <- c(0.35,  2.26,  0.17,   0.08,   0.27,  0.49,  0.65,   0.12,  1.45)
windows()
plot(x,y, ylim=c(0, 8), xlim=c(-0.4, 1.2), pch=19, cex.axis=0.8, 
     cex.lab=0.9, xlab="Male/Female expression ratio (log)", 
     ylab="Z/W expression ratio in females", las=1)
for (i in 1:9) {
  up  <- y[i] + sd[i]
  low <- y[i] - sd[i]
  segments(x[i],      low, x[i],      up)
  segments(x[i]-0.02, up,  x[i]+0.02, up)
  segments(x[i]-0.02, low, x[i]+0.02, low)
}

My question is that how I can get rid of the two top and right axes and only keep the bottom and left axes?

in the following picture

Upvotes: 3

Views: 270

Answers (3)

r0bert
r0bert

Reputation: 191

In case you want to keep the box-like appearance instead of "free floating" axes, add bty ="l" (a lower case L) to your plot command.

Resulting in:

plot(x, y, ylim=c(0, 8), xlim=c(-0.4, 1.2), pch=19, cex.axis=0.8, 
     cex.lab=0.9, xlab="Male/Female expression ratio (log)", 
     ylab="Z/W expression ratio in females", las=1, bty = "l")

This will only remove the upper and the right frame bar. See also ?par

Edit:
Looking at your graph and your calculations it seems, that you want to plot means for specific groups and then also show some standard deviation. In this case i would recommend looking into the boxplot() command which will do that for you using your original data. See ?boxplot

Upvotes: 5

Carlos V
Carlos V

Reputation: 101

You can also try adding frame = FALSE in your plot command:

plot(x, y, ylim=c(0, 8), xlim=c(-0.4, 1.2), pch=19, cex.axis=0.8, 
     cex.lab=0.9, xlab="Male/Female expression ratio (log)", 
     ylab="Z/W expression ratio in females", las=1, frame = FALSE)

Upvotes: 1

gung - Reinstate Monica
gung - Reinstate Monica

Reputation: 11893

@r0bert & @CarlosV have provided good answers. There is one other option as well: You can suppress the axes with the argument axes=FALSE and then construct your own using ?axis, which can give you more control over the axes. Here is some example code (as a bonus, I illustrate @thelatemail's comment about the vectorized version of segment()):

plot(x, y, axes=FALSE, ylim=c(0, 8), xlim=c(-0.4, 1.2), pch=19, 
     cex.axis=0.8, cex.lab=0.9, xlab="Male/Female expression ratio (log)", 
     ylab="Z/W expression ratio in females")
axis(side=1, cex.axis=0.8, cex.lab=0.9)
axis(side=2, cex.axis=0.8, cex.lab=0.9, las=1)
segments(x,      y-sd, x,      y+sd)
segments(x-0.02, y+sd, x+0.02, y+sd)
segments(x-0.02, y-sd, x+0.02, y-sd)

enter image description here

Upvotes: 0

Related Questions