Evitar la colisión de etiquetas de marca de eje en gráficos de gg facetados

En las parcelas multipanel / facetadas, me gusta cuando es posible aplastar los paneles juntos sin espacio entre ellos, p. utilizandotheme(panel.spacing=grid::unit(0,"lines")) (Edward Tufte dice que esto es bueno porque los espacios entre paneles producen efectos visuales que distraen, así como también desperdician espacio de datos, y he bebido este pedazo particular de Kool-Aid).

El problema es que, dependiendo del rango preciso de los valores dentro de una fila / columna de facetas, las etiquetas de eje para las facetas vecinas pueden superponerse. Por ejemplo, en este gráfico hay una colisión entre la etiqueta de marcación inferior en el panel superior y la etiqueta de marca superior en el panel central.

dd <- data.frame(x=rep(1:3,3),
                 y=c(0.1,0.2,0.3,
                     0.1,0.4,0.6,
                     1,2,3),
                 f=factor(rep(letters[1:3],each=3)))
library(ggplot2)
ggplot(dd,aes(x,y))+
   facet_grid(f~.,scale="free")+
   geom_point()+
   theme_bw(base_size=24)+
   theme(panel.spacing=grid::unit(0,"lines"))
ggsave("tmp1.png",width=4,height=6)

Quiero construir una solución general y conveniente para este problema: extender los límites de cada faceta por unapropiado&nbsp;cantidad (será diferente para cada faceta, ya que los rangos son heterogéneos) pero suprimiendo (al menos) etiquetas y (posiblemente) marcas de graduación para los valores extremos. He hecho esto en el pasado de una manera súper hacky estableciendo un propósito especialbreaks&nbsp;funcionar dentro descale_y_continuous. Es posible que haya pensado en otras formas de hacer esto (y las publicaré como respuesta si puedo hacer que funcionen), pero estoy buscando (a) funciones generales razonablemente sólidas para especificarlabels&nbsp;y / obreaks.

Esto no es lo mismo queAutomatice tick max y min en ggplot facetado&nbsp;, que solo quiere los valores máximo / mínimo por faceta.

Esto es difícil de hacer en general y podría no ser completamente solucionable; Pensé en borrar las etiquetas extremas, pero eso fallaría si solo hubiera dos o tres etiquetas de marca. Puede haber una solución conexpand_limits(), pero eso es difícil de hacer a través de las facetas ...