Предотвращение столкновения метки оси в граненых ggplots

На многопанельных / граненых участках мне нравится, когда возможно раздавливать панели без промежутков между ними, например с помощьюtheme(panel.spacing=grid::unit(0,"lines")) (Эдвард Туфте говорит, что это хорошо, потому что межпанельные пространства создают отвлекающие визуальные эффекты, а также тратят пространство данных, и я выпил этот конкретный кусочек Kool-Aid.)

Проблема заключается в том, что в зависимости от точного диапазона значений в строке / столбце фасетов метки осей для соседних фасетов могут перекрываться. Например, на этом графике есть столкновение между нижней меткой на верхней панели и верхней меткой на средней панели.

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)

Я хочу построить общее удобное решение этой проблемы - расширить границы каждого аспектаподходящее сумма (она будет отличаться для каждого аспекта, поскольку диапазоны неоднородны), но с подавлением (как минимум) меток и (возможно) отметок для крайних значений. Я сделал это в прошлом супер-хакерским способом, установив специальное назначениеbreaks функция внутриscale_y_continuous, Возможно, я думал о некоторых других способах сделать это (и опубликую их как ответ, если смогу заставить их работать), но я ищу (а) достаточно надежную общую функцию (и) для определенияlabels и / илиbreaks.

Это не то же самое, чтоАвтоматизируйте тик макс и мин в граненом ggplot , который просто хочет получить максимальные / минимальные значения по фасету.

Это сложно сделать в целом и может быть не совсем решаемо; Я думал о том, чтобы просто убрать экстремальные метки, но это не получилось бы, если бы было всего две или три метки. Там может быть решение сexpand_limits(), но это трудно сделать через грани ...

Ответы на вопрос(1)

Ваш ответ на вопрос