Préliminaires
Définir le tracé original et les paramètres souhaités pour les axes Y de chaque facette:
library(ggplot2)
g0 <- ggplot(mpg, aes(displ, cty)) +
geom_point() +
facet_grid(rows = vars(drv), scales = "free")
facet_bounds <- read.table(header=TRUE,
text=
"drv ymin ymax breaks
4 5 25 5
f 0 40 10
r 10 20 2",
stringsAsFactors=FALSE)
version 1: mettre des points de données fictifs
Cela ne respecte pas la spécification des breaks
, mais cela obtient les limites correctes:
Définir un nouveau data frame qui inclut les valeurs min/max pour chaque drv
:
ff <- with(facet_bounds,
data.frame(cty=c(ymin,ymax),
drv=c(drv,drv)))
Ajoutez-les aux tracés (ils ne seront pas tracés car x
est NA
, mais ils sont toujours utilisés pour définir les échelles)
g0 + geom_point(data=ff,x=NA)
C'est similaire à ce que fait expand_limits()
, sauf que cette fonction s'applique "pour tous les panneaux ou tous les tracés".
version 2: détecter dans quel panneau vous vous trouvez
Ceci est laid et dépend du fait que chaque groupe a une plage unique.
library(dplyr)
## calculer les limites pour chaque groupe
lims <- (mpg
%>% group_by(drv)
%>% summarise(ymin=min(cty),ymax=max(cty))
)
Fonction des ruptures: détermine quel groupe correspond à l'ensemble de limites qui lui est donné ...
bfun <- function(limits) {
grp <- which(lims$ymin==limits[1] & lims$ymax==limits[2])
bb <- facet_bounds[grp,]
pp <- pretty(c(bb$ymin,bb$ymax),n=bb$breaks)
return(pp)
}
g0 + scale_y_continuous(breaks=bfun, expand=expand_scale(0,0))
L'autre laideur ici est que nous devons définir expand_scale(0,0)
pour que les limites soient exactement égales aux limites du groupe, ce qui pourrait ne pas être la façon dont vous voulez le tracé ...
Il serait bien si la fonction breaks()
pouvait somehow également recevoir des informations sur le panneau actuellement en cours de calcul ...