9

I am plotting a time series with mean values of a response variable as points (y-axis) by month (x-axis).

Values lying on the x-axis (i.e. 0 values) are clipped. I can change the limits of the y-axis to include some padding below 0, but I prefer not to.

Is there a way to plot these 0 points in front of, or on-top of the x-axis?

4 Answers 4

19

Try this,

q <- qplot(1:10,1:10,size=I(10)) + scale_y_continuous(expand=c(0,0))
gt <- ggplot_gtable(ggplot_build(q))
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)

clipoff

Sign up to request clarification or add additional context in comments.

6 Comments

Will do, and try again. Thank you!
Subbing in the following code turns off clipping when faceting: gt$layout$clip[grep("panel",gt$layout$name)] <- "off"
how would you turn gt back into a ggplot/gg object?
i doubt you can, it's like turning a baked cake into flour and eggs
This solution doesn't work when the plot contains axes; try adding color = "red" to the aesthetics and + theme_bw() to the first line of the code. The axis appears on top of the red dots. (I haven't found a solution yet.)
|
17

With the release of ggplot2 version 3.0.0, you can simply use coord_cartesian(clip = 'off').

library(ggplot2)

qplot(x = 1:10, y = 1:10, size=I(10)) + 
  scale_y_continuous(expand=c(0,0)) +
  coord_cartesian(clip = 'off') +
  labs(title = "coord_cartesian(clip = 'off')")

enter image description here

If you're using one of the less commonly-used coord_* systems or functions (e.g. coord_polar or coord_flip), then you can use the clip = 'off' argument there, too.

my_plot + 
coord_flip(clip = 'off')

3 Comments

Thanks for pointing that out! Your point is now incorporated into the answer.
This solution doesn't work when the plot contains axes; try adding color = "red" to the aesthetics and + theme_bw() to the end of the code. The axis appears on top of the red dots. (I haven't found a solution yet.)
That's a good point. I'd recommend opening a new question to address that, because it's a separate issue and a good question.
3

You can use attribute expand() on the scale_y
Exemple for 10% each side of y scale :

ggplot(mydata, aes(y = value, x = mydate)) +
  geom_point() +
  scale_y_continuous(expand = c(0.1,0.1))

3 Comments

Thank you. This works by expanding the range of the y axis. It works nicely, but I would prefer something like that suggested by baptiste above. i.e., the x axis starts at 0, but the 0 points are plotted on-top of it. Thank you for your help, though.
I think that should be + scale_y_continuous(expand = c(0.1,0.1)).
This is great as it works dynamically for facetted plots.
-1

If you were using base graphics you could use clip().

plot(1:4)
clip(-0.5, 4.1, -0.5, 4.1)
points(0.85, 1, col = 'red', cex = 2)

1 Comment

I couldn't figure out how to make this work within ggplot script. I also tried plotting the figure, then clipping and adding a point on top. But that did not work either. Thanks.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.