Alinear y organizar gráficos en ggplot

Tengo dos gráficos en ggplot con rangos similares en el eje que me gustaría alinear.

Utilizando:

library(grid)
grid.newpage()
grid.draw(rbind(ggplotGrob(g1), ggplotGrob(g2), size = "last"))

dóndesize='last' garantiza que las cuadrículas estén alineadas para x, obtengo un diseño como este:

El gráfico superior tiene un rango vertical excesivo para la fila simple que quiero representar.

Me gustaría tener una imagen más acorde con lo siguiente:

O, alternativamente, con el gráfico g1 alineado debajo del eje del gráfico g2. (En general, digamos que quiero poder elegir cualquiera de ellos, o incluso superponer g1 sobre g2.

(Mi modelo original era un gráfico único con el componente g1 simplemente establecido como una capa en el gráfico g2 con y = 0; sin embargo, el gráfico está demasiado abarrotado para leer con ese diseño, por lo que pensé que debería mover el original y = 0 elementos en un panel separado (es decir, g1).

Ejemplo mínimo:

size=50
df1=data.frame(x=seq(1,size),y=sample(-100:100,size,rep=TRUE))
df2=data.frame(x=seq(1,size),r=replicate(size,paste(sample(c(letters, LETTERS),3),collapse='')))
g1=ggplot(df1)+geom_point(aes(x=x,y=y))
g2=ggplot(df2)+geom_text(aes(x=x,y=0,label=r),angle=45,size=2)
library(grid) 
grid.newpage()
grid.draw(rbind(ggplotGrob(g1), ggplotGrob(g2), size = "last"))

Quiero que la tira de etiquetas (g2) se coloque ordenadamente con respecto al diagrama de dispersión. La tira g2 era parte del gráfico original comogeom_text() elemento eny=0 pero el gráfico estaba demasiado abarrotado por allí con las etiquetas colocadas allí también.

Respuestas a la pregunta(1)

Su respuesta a la pregunta