Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Planning to draw a density line-plot with gapped (or broken) Y-axis in R, I initially tried out the plotrix package. However after facing a couple of problems, I ended up using the standard R graphics codes to draw the correct gapped line-plot.

Here I will only apply the break to the y-axis of a density line-plot, however similar method can be used for any line-plot or their X-axis as well.

#Defining values
n <- rnorm(100000, mean = 100, sd = 36)
m <- rnorm(500000, mean = 150, sd = 20)
p <- rnorm(1000000, mean = 160, sd = 20)
nd<- density(n)
md<- density(m)
pd<- density(p)

#Normal plotting
lwd<-1
plot(md, col=”red”, xlim=c(0,250))
points(nd,  type=”l”)
points(pd, col=”blue”, type=”l”)
legend(“topleft”, legend=c(“n”, “m”, “p”), col=c(“black”, “red”, “blue”), lwd=lwd)

Here is how the gapped line plot would look using plotrix. As you can see since the values higher than the gap were taken out from the bottom window a horizontal line is drawn at the top of the bottom window ! I tried various parameter settings but didn’t succeed in removing the horizontal line.

# define gap
gap=c(0.013,0.017)
# Define line width
lwd<-1

# Plot all lines with the gap setting
gap.plot(x=md$x, y=md$y, type=”l”, gap=gap,col=”red”,main=”lineplot with gap”, add=F, xlim=c(0,250))
gap.plot(nd$x,nd$y, type=”l”, gap=gap,col=”black”,main=”lineplot with gap”, add=T)
gap.plot(pd$x,pd$y, type=”l”, gap=gap,col=”blue”,main=”lineplot with gap”, add=T)
gap.plot(md$x,md$y, type=”l”, gap=gap,col=”red”,main=”lineplot with gap”, add=T)
gap.plot(pd$x,pd$y, type=”l”, gap=gap,col=”blue”,main=”lineplot with gap”, add=T)
legend(“topleft”, legend=c(“n”, “m”, “p”), col=c(“black”, “red”, “blue”), lwd=lwd)
text(190,0.0125,”?!!!”, col=”red”, cex=2)

In the end I used these codes to correctly draw the gapped line-plot.

# Define gap
gap=c(0.013,0.017)
#Defien distance between the bottom and top windows
gapDist<- .14
# Define line width
lwd<-1
# Define top vs bottom window size ratios (i.e. 1 vs 3)
layout(matrix(c(1,2), 2, 1, byrow = TRUE),
heights=c(1,3))

# Define margin sizes of the top widow
par(mar=c(yDist/2, 5.1, 4.1, 2.1))

# Plot all lines in the top window
plot(md, bgcol=”white”, col=”transparent”, type=’l’, xlab=””, ylab=””,
lty=1, main=””, xaxt=’n’, xlim=c(0,250), ylim=c(gap, max(md$y, na.rm=T))) points(nd, col=”black”, lwd=lwd, type=”l”) points(md, col=”red”, lwd=lwd, type=”l”) points(pd, col=”blue”, lwd=lwd, type=”l”) # You can add legend to top window if you wish! #legend(“topleft”, legend=c(“n”, “m”, “p”), col=c(“black”, “red”, “blue”), lwd=lwd) # Define margin sizes of the bottom widow par(mar=c(5.1, 5.1,yDist/2, 2.1)) # Plot all in lines in the bottom window plot(md, col=”transparent”, xlim=c(0,250), ylim=c(min(md$y, na.rm=T), gap),  type=’l’,
ylab=”Density”, main=””)
points(nd, col=”black”, lwd=lwd, type=”l”)
points(md, col=”red”, lwd=lwd, type=”l”)
points(pd, col=”blue”, lwd=lwd, type=”l”)

# Add legend to the top left of the bottom  window
# Alternatively you can add legend to top window!
legend(“topleft”, legend=c(“n”, “m”, “p”), col=c(“black”, “red”, “blue”), lwd=lwd)