如何在分面ggplot中同时启用scale=free与scale(expand)设置独立轴范围?
解决ggplot2分面下移除柱形与x轴空白且保留自由y轴的问题
首先先看你的初始绘图代码:
library(ggplot2) df <- data.frame(Treatment=c("A", "B","A","B"), Value=c(3,4, 20,2), SE=c(1,1,5,1), Type=c("c1","c1","c2","c2")) p1 <- ggplot(df, aes(Treatment, Value,fill=Treatment)) + geom_bar(stat="identity", col="Black") + geom_errorbar(aes(ymax = Value + SE, ymin=Value), col="black") + facet_wrap(~Type, scale="free_y") + theme(panel.background = element_blank(), panel.border = element_rect(colour = "black", fill=NA), strip.background = element_blank()) p1
你遇到的问题确实很棘手:直接用scale_y_continuous(expand = c(0,0))能去掉柱形和x轴的空白,但会连y轴顶部的空白也删掉,误差线可能直接顶到面板边缘;而硬设limits=c(0,26)又会废掉scale="free_y"的自由轴效果,让小数值的面板(比如c1)多出一大片空白。
完美解决方案:精细控制轴扩展量
从ggplot2 3.3.0版本开始,我们可以用expansion()函数(替代旧版的expand参数)分别控制y轴底部和顶部的扩展比例,这样既能让柱形紧贴x轴,又能给每个分面的y轴顶部保留合适空白,同时完全保留scale="free_y"的自由轴特性。
修改后的代码如下:
p1 + scale_y_continuous(expand = expansion(mult = c(0, 0.05)))
mult = c(0, 0.05):第一个值0表示y轴底部(柱形与x轴之间)完全没有扩展空白;第二个值0.05表示y轴顶部会在当前面板的最大值基础上增加5%的空白(你可以根据自己的需求调整这个比例,比如改成0.1就是10%)。
如果你的ggplot2版本比较旧,也可以用expand参数的传统写法实现相同效果:
p1 + scale_y_continuous(expand = c(0, 0.05))
这样调整后,每个分面的y轴会自动适配自身数据范围,底部紧贴x轴,顶部保留合理空白,完全不会破坏分面自由轴的设定~
内容的提问来源于stack exchange,提问作者nouse
相关产品推荐
相关产品推荐

