如何在不手动设置限制的情况下,使用ggplot2非对称地扩展轴?

12

我希望条形图底部的轴线为零,但是顶部根据某个比例扩展一小段。然而,我正在绘制stat_summary的输出,因此我没有最大值可用,并且我正在使用scale="free_y"的分面图,因此我不能手动设置它们。否则,我会使用baptiste添加geom_blank的技巧。我知道我可以读取值并手动创建具有上限的数据框,但是否可以在不必硬编码限制的情况下设置这些值?

另一种选择是在函数调用之外计算平均值,然后只需绘制该值,而不需要调用stat_summary(这样我就直接拥有每个分面的上界),但除此之外还有其他方法吗?

示例:

ggplot(mtcars)+
  stat_summary(aes(cyl,mpg),
               fun.y="mean",
               geom="bar")+
  scale_y_continuous(expand=c(0,0))+
  facet_grid(carb~.,"free_y")
1个回答

9
你可以通过创建一个自定义类并实现内部S3方法scale_dimension来“扩展”ggplot,代码如下所示:
library("scales")
scale_dimension.custom_expand <- function(scale, expand = ggplot2:::scale_expand(scale)) {
  expand_range(ggplot2:::scale_limits(scale), expand[[1]], expand[[2]])
}

scale_y_continuous <- function(...) {
  s <- ggplot2::scale_y_continuous(...)
  class(s) <- c('custom_expand', class(s))
  s
}

这也是覆盖默认比例的一个示例。现在,要得到所需的结果,您可以像这样指定扩展

qplot(1:10, 1:10) + scale_y_continuous(expand=list(c(0,0.1), c(0,0)))

列表中的第一个向量是乘法因子,第二个向量是加法部分,每个向量的第一个(第二个)元素对应于较低(较高)的边界。


3
我使用 ggplot 的 2.0.0 版本时出现问题,提示错误信息为 Error in diff(range) * mul : non-numeric argument to binary operator - YvanR
2
@YvanR 对于 ggplot2 v2 的解决方案,请参见 https://dev59.com/ulsW5IYBdhLWcg3wwZYP(目前有一个拉取请求添加支持不对称范围扩展)。 - Karl Ove Hufthammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接