how to set limits on rounded facet wrap y axis?

facet, ggplot2, r

Solution

dat = data.frame(x = c(1,2,3,1,2,3),A=c(80.6, 82,83,60,61,62),A_up =c(81,84,85,62,63,64), A_low =c(79,78,81,59,58,57), group = c("z","z","z","y","y","y"))


dat <- data.table(dat)

dat[, y_min := floor(  min(A_low)  /10)*10, by = group]
dat[, y_max := ceiling(max(A_up)/10)*10 , by = group]

ggplot(data=dat , aes(x=as.factor(x), y=A, group = 1)) + #, color =Group, group = Group 
  geom_line()  + geom_point() + # facet_wrap(~COUNTERPARTY_STRATEGY ,ncol=2)
  geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) +
  scale_y_continuous(breaks = seq(  floor(  (min(dat$A_low)-11)  /10)*10 ,
                                    ceiling(  (max(dat$A_up)+11) /10)*10,10 ),
                     labels = seq(  floor(  (min(dat$A_low)-11)  /10)*10 ,
                                    ceiling(  (max(dat$A_up)+11) /10)*10,10 )
  ) +
  facet_wrap(~group ,ncol=2, scales = "free_y") + 
geom_blank(aes(y = y_min)) + geom_blank(aes(y = y_max))

So here I use data.table `by = group` to create `y_min` and `y_max` for each group. And then use those values in `geom_blank` to extend the plot area.

Obviously, this is automatically scalable to any number of groups/facets.

Problem

I have this plot and I need to round the y axis so what appears is acceptable EXCEPT for the fact that I would like to not just show 1 value on the y axis. I'd like to add the "limit" to the "scale_y_continuous" function so that the limits for each facet plot are unique to the individual facet. here is the plot only showing 60 and 80 on the y axis ``` dat = data.frame(x = c(1,2,3,1,2,3),A=c(80.6, 82,83,60,61,62),A_up =c(81,84,85,62,63,64), A_low =c(79,78,81,59,58,57), group = c("z","z","z","y","y","y")) ggplot(data=dat , aes(x=as.factor(x), y=A, group = 1)) + #, color =Group, group = Group geom_line() + geom_point() + # facet_wrap(~COUNTERPARTY_STRATEGY ,ncol=2) geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) + scale_y_continuous(breaks = seq( floor( (min(dat$A_low)-11) /10)*10 , ceiling( (max(dat$A_up)+11) /10)*10,10 ), labels = seq( floor( (min(dat$A_low)-11) /10)*10 , ceiling( (max(dat$A_up)+11) /10)*10,10 ) ) + facet_wrap(~group ,ncol=2, scales = "free_y") ``` Now I add the limit in the scale y continuous and it applies the limit globally. ``` dat = data.frame(x = c(1,2,3,1,2,3),A=c(80.6, 82,83,60,61,62),A_up =c(81,84,85,62,63,64), A_low =c(79,78,81,59,58,57), group = c("z","z","z","y","y","y")) ggplot(data=dat , aes(x=as.factor(x), y=A, group = 1)) + #, color =Group, group = Group geom_line() + geom_point() + # facet_wrap(~COUNTERPARTY_STRATEGY ,ncol=2) geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) + scale_y_continuous(breaks = seq( floor( (min(dat$A_low)-11) /10)*10 , ceiling( (max(dat$A_up)+11) /10)*10,10 ), labels = seq( floor( (min(dat$A_low)-11) /10)*10 , ceiling( (max(dat$A_up)+11) /10)*10,10 ), # limits = c( floor( min(dat$A_low[dat$group =="z"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="z"])/10)*10 ) #limits = c( floor( min(dat$A_low[dat$group =="z"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="z"])/10)*10 ) limits = c( floor( min(dat$A_low) /10)*10 ,ceiling(max(dat$A_up)/10)*10 ) ) + facet_wrap(~group ,ncol=2, scales = "free_y") ``` i.e. `c( floor( min(dat$A_low) /10)*10 ,ceiling(max(dat$A_up)/10)*10 )` is 50 and 90 but I would like the limit to be unique to each facet plot so something like so the right plot would have limits of `c( floor( min(dat$A_low[dat$group =="y"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="y"])/10)*10 )` 50 and 70 and the left plot would have limit of `c( floor( min(dat$A_low[dat$group =="z"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="z"])/10)*10 )` 70 and 90 how can the limits be adjusted to be specific to the individual facet plots?

Original source

Related problems