R Ggplot2 Scale_Y_Continuous: Combining Breaks & Limits

Problem: I cannot find any way to combine the breaks and limits commands in ggplot2. The y-axis should always contain the range of 0-40 and breaks=c(5,10,15,20,25,30,35). The x-axis should be 0-100, breaks=c(10,20,30,40,50,60,70,80,90,100). I do NOT want to display data that is outside this range.

I tried + ylim, but this overwrites my breaks. I tried + expand, but this also shows data outside the range that I want(1-100). I tried both adding the breaks and limiting the range in a second step, but the y-axis of my first step is simply overwritten if I do that.

plot_Tili_Age_VS_Height <- ggplot(Tili, aes(x = Age, y = Height)) + geom_point() + 
  geom_smooth(method = "lm", se = FALSE, color = "black", formula = y ~ x) + 
  scale_y_continuous(trans = "log10", breaks = c(5, 10, 15, 20, 25, 30, 35)) + 
  expand_limits(y = c(0, 35), x = c(0, 100)) + 
  scale_x_continuous(trans = "log10", breaks = c(10, 20, 30, 40, 50, 60,70, 80, 90, 100)) +
  theme_bw(base_size = 15) + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

df <- data.frame(x = log(Tili$Age), y = log(Tili$Height))
lm_eqn = function(df) {
  m = lm(y ~ x, df)
  eq <- substitute(ln(italic(y)) == a + b %*% ln(italic(x)) * "," ~ ~italic(r)^2 ~ 
                     "=" ~ r2, list(a = format(coef(m)[1], digits = 2), 
                                    b = format(coef(m)[2], digits = 2), 
                                    r2 = format(summary(m)$r.squared, digits = 2)))
  as.character(as.expression(eq))
}

plot_Tili_Age_VS_Height <- plot_Tili_Age_VS_Height + 
  annotate("text", x = 30, y = 5, label = lm_eqn(df), hjust = 0, 
           size = 3, family = "Times", parse = TRUE)
plot_Tili_Age_VS_Height 

Any idea how to fix it?

6

1 Answer

As JasonAizkalns commented your problem can't be solved without n reproducible example. The code below does what you want on the iris data and should work for your example as well.

library(ggplot2)

df <- iris


## all data, default breaks
ggplot(df, aes(Sepal.Length, Sepal.Width)) +
  geom_point()

## subset of data is seen in plot, breaks changed
ggplot(df, aes(Sepal.Length, Sepal.Width)) +
  geom_point() + 
  scale_x_continuous(breaks = c(5.5,6.5), limits = c(5,7)) +
  scale_y_continuous(breaks = c(3.5,2.5), limits = c(2,4))
2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Sarah Jenkins

Sarah Jenkins

Senior Technology Editor & AI Specialist

Sarah Jenkins is a veteran tech journalist with over 12 years of experience covering artificial intelligence, mobile innovations, and digital ethics. Her insights have appeared in leading technology publications worldwide.

Share this article
Twitter Facebook Pinterest