Линейный график, накладывающийся на гистограмму в базе r

#r #ggplot2

#r #ggplot2

Вопрос:

Я написал следующий код ниже. Я хотел бы наложить столбчатый график на линейный график. Имеющийся у меня код делает все это, но только с одной проблемой. Я бы хотел, чтобы точки на линейном графике находились в центре гистограммы, то есть они должны немного сместиться влево. где я это упускаю? Если это можно сделать и в ggplot, я тоже был бы рад. но даже база r подошла бы

 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()
  

Ответ №1:

Может быть сложно выстроить вещи в ряд, если вы используете barplot и стандарт plot() . Я рекомендую вызывать только plot один раз. Чтобы сделать это, вам нужно будет изменить масштаб ваших yy2 значений до того же масштаба, что и yy . Вот как вы могли бы это сделать

 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()
  

В результате получается следующий график

введите описание изображения здесь

Ответ №2:

Проблема в том, что у вас разный масштаб x из-за разных полей двух графиков.

Если вы не хотите находить xx2 вручную … другое решение, которое следует рассмотреть, — использовать вместо этого правую ось y.

 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)
  

двойной график