Dear list, I need to plot four almost horizontal lines with y-values around 1,3,4, 400. If I plot them directly, the first three lines will be indiscernible so I am thinking of breaking y-axis into two parts, one with range (0,5), another (395,400). Is there an easy way to do this? I can think of two ways: 1. use two plots and draw axes manually. The plot margins, are however difficult to adjust. 2. use one plot, adjust y-values of the lines and draw y-axis manually. But, how would I break y-axis and add separation symbols *on* yaxis? (By separation symbol, I mean something like ------//------ Many thanks in davance. Bo
How to break an axis?
5 messages · Bo Peng, Joerg van den Hoff, Jim Lemon +1 more
Bo Peng wrote:
Dear list, I need to plot four almost horizontal lines with y-values around 1,3,4, 400. If I plot them directly, the first three lines will be indiscernible so I am thinking of breaking y-axis into two parts, one with range (0,5), another (395,400). Is there an easy way to do this? I can think of two ways: 1. use two plots and draw axes manually. The plot margins, are however difficult to adjust. 2. use one plot, adjust y-values of the lines and draw y-axis manually. But, how would I break y-axis and add separation symbols *on* yaxis? (By separation symbol, I mean something like ------//------ Many thanks in davance. Bo
______________________________________________ R-help at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
maybe something like
matplot(1:10, rep(1,10)%o%c(1,3,4), col=1:3, ylim = c(0,20), type='b')
par(new=T)
matplot(1:10, rep(400,10),axes=F,ann=F, col=4, ylim = c(0,400),type='b')
axis(4)
legend(par('usr')[2], par('usr')[4], bg='white', xjust=1, c('left
axis', 'left axis', 'left axis', 'right axis'),col=1:4,
pch=as.character(1:4))
solves your problem (double y-axis instead of splitting the axis).
joerg
Tom Mulholland has already pointed out that the plotrix package has an
axis.break() function that will draw the break symbol. Your problem is a
combination of plotting two disparate sets of data and getting the
y-axis right. The following is one way to do it, just be careful that
the ylim= and labels= arguments match up.
y1<-1+rnorm(10)/5
y2<-3+rnorm(10)/5
y3<-4+rnorm(10)/5
y4<-397+rnorm(10)/5
library(plotrix)
plot(y1,ylim=c(0,10),axes=FALSE,main="Big range plot",ylab="Y values")
points(y2)
points(y3)
box()
axis(2,at=c(1,2,3,4,6,7,8,9),labels=c("1","2","3","4","396","397","398","399"))
axis.break(2,5)
par(new=TRUE)
plot(y4,ylim=c(390,400),axes=FALSE,main="",ylab="",xlab="")
Thank you very much for the real code. I did almost exactly the same thing. I did not know the new=TRUE option so I used lines(y4-offset, ...). Anyway, the results are the same. The left-right-axes solution is also very interesting. It is actually better if the ranges of lines differ significantly. Thank you again for the help. Bo
Bo Peng wrote:
Dear list, I need to plot four almost horizontal lines with y-values around 1,3,4, 400. If I plot them directly, the first three lines will be indiscernible so I am thinking of breaking y-axis into two parts, one with range (0,5), another (395,400). Is there an easy way to do this? I can think of two ways: 1. use two plots and draw axes manually. The plot margins, are however difficult to adjust. 2. use one plot, adjust y-values of the lines and draw y-axis manually. But, how would I break y-axis and add separation symbols *on* yaxis? (By separation symbol, I mean something like ------//------
Hi Bo,
Tom Mulholland has already pointed out that the plotrix package has an
axis.break() function that will draw the break symbol. Your problem is a
combination of plotting two disparate sets of data and getting the
y-axis right. The following is one way to do it, just be careful that
the ylim= and labels= arguments match up.
y1<-1+rnorm(10)/5
y2<-3+rnorm(10)/5
y3<-4+rnorm(10)/5
y4<-397+rnorm(10)/5
library(plotrix)
plot(y1,ylim=c(0,10),axes=FALSE,main="Big range plot",ylab="Y values")
points(y2)
points(y3)
box()
axis(2,at=c(1,2,3,4,6,7,8,9),labels=c("1","2","3","4","396","397","398","399"))
axis.break(2,5)
par(new=TRUE)
plot(y4,ylim=c(390,400),axes=FALSE,main="",ylab="",xlab="")
Jim
What about simply using a log scale on the y axis? I.e. plot(..., log="y")
Bj??rn-Helge Mevik