I would like to modify the breaks and limits of y-axis of each one of the graphs in the facet_wrap. I want for example reduce the breaks for some of them or I want that they
I don't know of a way to modify the axis breaks and ranges of individual facets in a faceted plot. However, another option is to create separate plots for each level of the faceting variable and then lay out all the plots together. Creating each plot individually allows you to have finer control over axis breaks and ranges for each plot.
Here's an example with the built-in mtcars
data frame:
library(scales) # For pretty_breaks
library(grid) # For textGrob
library(gridExtra) # For grid.arrange
library(cowplot) # For plot_grid
The code below creates a list of plots, one for each level of cyl
. Note the use of scale_y_continuous
to set the y-range for each plot. This is just an illustration. You can exert much finer control over the axis ranges and breaks for each plot if you wish.
pl = lapply(sort(unique(mtcars$cyl)), function(i) {
p = ggplot(mtcars[mtcars$cyl==i, ], aes(wt, mpg)) +
facet_wrap(~cyl) +
geom_point() +
labs(x="Weight", y="") +
scale_y_continuous(limits=c(ifelse(i==4, 10, 0), 1.1 * max(mtcars$mpg[mtcars$cyl==i])),
breaks=pretty_breaks(ifelse(i==6, 6, 3))) +
scale_x_continuous(limits=range(mtcars$wt)) +
theme(plot.margin=unit(c(0, 0.1, 0, -1),"lines"))
# Remove x-axis labels and title except for last plot
if(i < max(mtcars$cyl)) p = p + theme(axis.text.x=element_blank(),
axis.title.x=element_blank())
return(p)
})
Now, lay out the plots in a single column. We also add a y-axis label.
grid.arrange(textGrob("MPG", rot=90), plot_grid(plotlist=pl, ncol=1, align="h"),
widths=c(0.03,0.97), ncol=2)