Skip to content

Make Andrew happy with one simple ggplot trick

By default, ggplot expands the space above and below the x-axis (and to the left and right of the y-axis). Andrew has made it pretty clear that he thinks the x axis should be drawn at y = 0. To remove the extra space around the axes when you have continuous (not discrete or log scale) axes, add the following to a ggplot plot,

plot <-
  plot + 
  scale_x_continuous(expand = c(0, 0)) + 
  scale_y_continuous(expand = c(0, 0))

Maybe it could even go in a theme.

Hats off to A5C1D2H2I1M1N2O1R2T1 (I can't make these handles up) for posting the solution on Stack Overflow.


  1. Josefina says:

    You can also do that with



  2. Ben Hanowell says:

    Dude… you just changed my life.

  3. Witold says:

    That’s handy. Thanks Bob!

  4. Jon Spring says:

    + expand_limits(y=0)

  5. Anoneuoid says:

    Hats off to A5C1D2H2I1M1N2O1R2T1 (I can’t make these handles up)

    Reminds me of clinical trial acroynyms.


  6. jd says:

    Nice! Thanks for posting this

  7. Andrew says:

    The moral of the story is: Do something that makes me happy, and it will make lots of other people happy too!

  8. This is one I don’t generally agree with. Too many times I have functions that are supposed to do things like asymptote to zero, and I want to see it actually go horizontal, not intersect the bottom of the frame and I have no idea what it did after that (does it go along the bottom of the frame, or is it crossing down below zero because of a bug?)

    Maybe this reflects the kinds of things I deal with rather than a general principle.

    • Phil says:

      I like having the scale go below zero, but having a horizontal line at zero.

    • Zhou Fang says:

      If I’m honest, I don’t really think too hard about this, but I think I’d prefer to make some distinction between values that *cannot* go below zero (e.g. binomial fits), values that probably shouldn’t (e.g. linear regression lazily applied to proportions), and values that merely happened to all be above zero in the sample (e.g. net worths of individuals). I’d probably only want to get rid of the expansion in the first case.

  9. Julien says:

    The problem is that this will also remove the space on the top.

    A better solution to only remove the space at the bottom is:

    + scale_y_continuous(expand=expand_scale(mult=c(0,.05)))


    + scale_y_continuous(expand=expand_scale(add=c(0,10)))

    The first will add 5% only on the top, the second will add 10 units (also only at the top).

  10. F. George Dunham, III says:

    What about space at the top? Also, y=0 is just as limiting, should all be more open.

    Gary Stone has written in his blog that all coordinates should be considered to be absolute values. Of course, I think Gary Stone is a rabid fleash-eating hobbit so why would I listen to him? Ha aha aha ha! People don’t realize that Gary Stone learned UI dev from Rick “I’m a giant donkey” Thorn, so that’s why you shouldn’t read his blog. (Is that enough bait to finally get Gary to comment here????)

    Julien, best to approach it with % than units based on varying screen requirements.

  11. Steve Stigler was the first, AFAIK, to point out this problem in the context of histograms. In an unpublished letter to The American Statistician, he noted that the S histograms floated above the horizontal axis. Densities sit on the ground, he claimed. The original R team unfortunately cloned the graphics in S, so this quirk persisted in R graphics. Kudos to A5C1D2H2I1M1N2O1R2T1 posting a workaround and to Bob Carpenter for bringing it to our attention.

Leave a Reply