12

I want the bottom axis for a barplot to be zero, but top expanded by a small amount (according to some scale). However, I am plotting the output of stat_summary so I do not have the maximum value available to me, and I am using facets with scale="free_y" so I cannot manually set them. Otherwise I would use baptiste's trick of adding geom_blank. I know I could read off the values and create a data frame with upper bounds manually, but can this be set without having to hard-code the limits?

The other option is to compute the means outside of the function call and just plot that without calling stat_summary (this way I have the upper bounds directly for each facet), but is there any way around this?

Example:

ggplot(mtcars)+
  stat_summary(aes(cyl,mpg),
               fun.y="mean",
               geom="bar")+
  scale_y_continuous(expand=c(0,0))+
  facet_grid(carb~.,"free_y")
Community
  • 1
  • 1
hatmatrix
  • 42,883
  • 45
  • 137
  • 231

1 Answers1

9

You can "extend" ggplot by creating a scale with a custom class and implementing the internal S3 method scale_dimension like so:

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
}

This is also an example of overriding the default scale. Now, to get the desired result you specify expand like so

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

where the first vector in the list is the multiplicative factor, the second is the additive part and the first (second) element of each vector corresponds to lower (upper) boundary.

Gregor Thomas
  • 136,190
  • 20
  • 167
  • 294
Rosen Matev
  • 1,828
  • 19
  • 20
  • 3
    It doesn't work for me, with version 2.0.0 of ggplot. I get `Error in diff(range) * mul : non-numeric argument to binary operator` – YvanR Jan 07 '16 at 22:33
  • 2
    @YvanR For a `ggplot2` v2 solution, see https://stackoverflow.com/questions/34623780/asymmetric-expansion-of-limits-ggplot2-2-0 (there is currently a pull request for adding support for asymmetrical range expansion). – Karl Ove Hufthammer Jul 17 '16 at 16:29