在多面板/分面图中,我喜欢将面板合并在一起,使它们之间没有空间,例如使用
问题在于,根据各个分面行/列内数值的具体范围,相邻分面的轴标签可能会发生重叠。例如,在此图中,顶部面板中的底部刻度标签与中间面板中的顶部刻度标签有碰撞。
theme(panel.spacing=grid::unit(0,"lines"))
(Edward Tufte认为这样做很好,因为面板间的间隔会产生分散注意力的视觉效果,也会浪费数据空间,而我相信了他的说法)。问题在于,根据各个分面行/列内数值的具体范围,相邻分面的轴标签可能会发生重叠。例如,在此图中,顶部面板中的底部刻度标签与中间面板中的顶部刻度标签有碰撞。
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)
我想要构建一个通用、方便的解决方案来解决这个问题——通过适当的方式(对于每个分面而言将不一样,因为它们的范围是异质的)扩展每个分面的限制,但抑制(至少)极值的标签和(可能的)刻度线。 我以前用非常 hacky 的方法在 scale_y_continuous
中设置了一个专门用途的 breaks
函数来实现这一点。我可能已经想到了其他的方法(如果我能让它们正常工作,我会把它们发布为答案),但我正在寻找可以指定 labels
和/或 breaks
的合理稳健的通用函数。
这与Automate tick max and min in faceted ggplot 不同,后者只是想要按分面获取最大/最小值。
这在一般情况下很棘手,可能无法完全解决;我考虑过仅清除极值标签,但如果只有两个或三个刻度标签,这种方法就会失败。也许有一个使用 expand_limits()
的解决方案,但在多个分面上很难实现...
prepanel()
和yscale.components()
函数就可以了。我期待着大家在这里提出的任何解决方案。 - Josh O'Brienscale_y_continuous
的breaks
和labels
参数有可能得到一个合理的解决方案。更多的是关于在那里放置内容的问题(就像prepanel()
一样...)。 - Ben Bolker