Предотвращение столкновения метки оси в граненых 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()
, но это трудно сделать через грани ...