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)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…