0

I have written the following code below. I would like to overlay a bar graph with a line graph. The code I have does it all but with just one problem. I would like the points on the line graph to be in the center of the bar graph, i.e. they should shift to the left a little bit. where Im I missing it? If this can be done in ggplot as well I would be happy too. but even base r would do

par(mai = c ( 1 , 2, 1, 1), omi = c(0, 0, 0, 0)) yy <- c(31,31,31,50,50,61,69,75,80,88,94,101,108,115,121,124,125,125,125,126,127) name1 <- c ("15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35") xx <- barplot(yy, ylab = "", names.arg = name1, ylim = c(0, 140),col="steelblue") text(xx, yy + 3, labels = as.character(yy),srt=45) mtext(2,text="",line=2) par(new = T) xx2 <- c(15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35) yy2 <- c(379,474,579,725,922,1181,1473,1846,2316,2962,3688,4786,6069,7605,9504,10680,11074,11074,11074,11483,11484) plot(xx2, yy2, xlim = c(14, 36), ylim = c(0, 14000),type ="n" , axes = F, xlab ="", ylab ="",col="blue",main="") lines(xx2, yy2, lwd = 2,col="red",lty=1) points(xx2, yy2, pch = 18, cex = 1,col="red") text(xx2, yy2 + 4 , labels = as.character(yy2),srt=90) par(new = T) par(mai = c ( 1 , 1, 1, 1)) axis(2) mtext(2,text="",line=2.5) mtext("",side=1,col="black",line=2) grid() 

2 Answers 2

1

It can be quote tricky to get things to line up if you use barplot and a standard plot(). I recommend only calling plot once. In order to do this, you will need to rescale your yy2 values to the same scale as yy. Here's how you might do that

par(mai = c ( 1 , 2, 1, 1), omi = c(0, 0, 0, 0)) yy <- c(31,31,31,50,50,61,69,75,80,88,94,101,108,115,121,124,125,125,125,126,127) name1 <- c ("15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35") #draw bar plot xx <- barplot(yy, ylab = "", names.arg = name1, ylim = c(0, 140),col="steelblue") text(xx, yy + 3, labels = as.character(yy),srt=45) mtext(2,text="",line=2) xx2 <- xx #c(15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35) yy2 <- c(379,474,579,725,922,1181,1473,1846,2316,2962,3688,4786,6069,7605,9504,10680,11074,11074,11074,11483,11484) #transform data yy2tx <- yy2/14000 * max(pretty(yy)) #draw line data lines(xx2, yy2tx, lwd = 2,col="red",lty=1) points(xx2, yy2tx, pch = 18, cex = 1,col="red") text(xx2, yy2tx, labels = as.character(yy2),srt=90) #draw axis for transformed data par(mai = c ( 1 , 1, 1, 1)) axis(2, at=pretty(c(0,14000))/14000*max(pretty(yy)), labels=pretty(c(0,14000))) grid() 

This produces the following plot

enter image description here

Sign up to request clarification or add additional context in comments.

Comments

0

The problem is that you have different x scale due to the different margins of the two plots.

Unless you want to find xx2 by hand... another solution to consider is to use a right y axis instead.

yy <- c(31,31,31,50,50,61,69,75,80,88,94,101,108,115,121,124,125,125,125,126,127) name1 <- c ("15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35") xx <- barplot(yy, ylab = "", names.arg = name1, ylim = c(0, 140),col="steelblue") text(xx, yy + 3, labels = as.character(yy),srt=45) mtext(2,text="",line=2) par(new = T) yy2 <- c(379,474,579,725,922,1181,1473,1846,2316,2962,3688,4786,6069,7605,9504,10680,11074,11074,11074,11483,11484) plot(xx+0.5, yy2, "l", lwd = 2,col="red",lty=1, axes=F, ylim=c(0, 14000), xlim=c(min(xx), max(xx)+1)) points(xx+0.5, yy2, pch = 18, cex = 1,col="red") axis(4) text(xx+0.5, yy2 + 4 , labels = as.character(yy2),srt=90) 

double plot

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.