2010-11-25 32 views
24

Certaines données d'échantillon:Comment définissez-vous différentes limites d'échelle pour différentes facettes?

dfr <- data.frame(
    x = rep.int(1:10, 2), 
    y = runif(20), 
    g = factor(rep(letters[1:2], each = 10)) 
) 

Un diagramme de dispersion simple avec deux facettes:

p <- ggplot(dfr, aes(x, y)) + 
    geom_point() + 
    facet_wrap(~ g, scales = "free_y") 

je peux définir les limites d'axe pour tous les panneaux avec

p + scale_y_continuous(limits = c(0.2, 0.8)) 

(ou une enveloppe pour cette comme ylim)

mais comment puis-je définir di limites d'axe fférentes pour différentes facettes?

La façon latticey de le faire serait de passer une liste à cet argument, par exemple,

p + scale_y_continuous(limits = list(c(0.2, 0.8), c(0, 0.5))) 

Malheureusement, ce juste une erreur lancers francs dans le cas de ggplot2.

EDIT:

est ici un hack partiel. Si vous souhaitez étendre la plage des échelles, vous pouvez ajouter des colonnes à votre ensemble de données en spécifiant les limites, puis les dessiner avec geom_blank.

ensemble de données modifié:

dfr <- data.frame(
    x = rep.int(1:10, 2), 
    y = runif(20), 
    g = factor(rep(letters[1:2], each = 10)), 
    ymin = rep(c(-0.6, 0.3), each = 10), 
    ymax = rep(c(1.8, 0.5), each = 10) 
) 

parcelle Mise à jour:

p + geom_blank(aes(y = ymin)) + geom_blank(aes(y = ymax)) 

Maintenant, les échelles sont différentes et la main gauche on est correcte. Malheureusement, l'échelle de la main droite ne se contracte pas car elle doit faire de la place pour les points. Si cela peut vous aider, nous pouvons maintenant reformuler la question comme "est-il possible de dessiner des points sans recalculer les échelles et sans appeler explicitement scale_y_continuous?"

Répondre

5

Je ne pense pas que ce soit encore possible dans ggplot2. Cette discussion de Janvier suggère que la question est à l'étude.

+0

Merci pour le lien. Pas tout à fait la réponse que j'espérais cependant. –

+0

@Ritchie: Vérifiez avec Hadley, il pourrait avoir quelque chose dans les travaux dans les versions de développement de ggplot2 –

0

Pour contracter la graduation sur le tracé de gauche, supprimez les points situés en dehors de la plage. Par exemple. cela permettra de réduire l'échelle y sur le graphique de droite à des valeurs comprises entre 0 et 0,5:

p <- ggplot(dfr, aes(x, y)) + 
    geom_point(subset=.(g == "a" | (y > 0 & y <.5))) + 
    geom_blank(aes(y = ymin)) + geom_blank(aes(y = ymax)) + 
    facet_wrap(~ g, scales = "free_y") 

Voir aussi ma réponse à cette question.