Comment définir les limites des axes dans les tracés ggplot2 R?

358

Je trace ce qui suit:

library(ggplot2)    

carrots <- data.frame(length = rnorm(500000, 10000, 10000))
cukes <- data.frame(length = rnorm(50000, 10000, 20000))
carrots$veg <- 'carrot'
cukes$veg <- 'cuke'
vegLengths <- rbind(carrots, cukes)

ggplot(vegLengths, aes(length, fill = veg)) +
 geom_density(alpha = 0.2)

Maintenant, disons que je veux seulement tracer la région entre x=-5000à 5000, au lieu de toute la plage.

Comment puis je faire ça?

David B
la source

Réponses:

585

Fondamentalement, vous avez deux options

scale_x_continuous(limits = c(-5000, 5000))

ou

coord_cartesian(xlim = c(-5000, 5000)) 

Où le premier supprime tous les points de données en dehors de la plage donnée et le second ajuste uniquement la zone visible. Dans la plupart des cas, vous ne verrez pas la différence, mais si vous ajustez quelque chose aux données, cela changera probablement les valeurs ajustées.

Vous pouvez également utiliser la fonction raccourci xlim(ou ylim), qui, comme la première option, supprime les points de données en dehors de la plage donnée:

+ xlim(-5000, 5000)

Pour plus d'informations, consultez la description de coord_cartesian.

Le cheatsheet RStudio pour le ggplot2rend très clair visuellement. Voici une petite section de cette feuille de triche:

entrez la description de l'image ici

Distribué sous CC BY .

midtiby
la source
16
il y a aussi maintenant library(scales); ... + scale_x_continuous(limits = c(-5000, 5000), oob=squish)(la valeur par défaut est oob=censor); voir ?squish, ?censor: groups.google.com/forum/#!topic/ggplot2/AsJ6xpmR9tU
Ben Bolker
5
NB. cela peut être problématique si vous traitez avec des lignes / polygones où certains sommets sont en dehors des limites, car l'objet entier est supprimé de l'intrigue
geotheory
1
@geotheory: est-ce également vrai de l' coord_cartesianapproche?
Nick Stauner
1
Non, j'aurais dû être plus précis, juste la première méthode
geotheory
En pratique, à des fins d '«impression», coord_cartesian(xlim = vous devrez probablement ylimégalement réinitialiser et réinitialiser les ruptures d'étiquette et de grille.
PatrickT du
44

Remarque rapide: si vous utilisez également coord_flip()pour inverser les axes x et y, vous ne pourrez pas définir de limites de plage en utilisant coord_cartesian()ces deux fonctions étant exclusives (voir ici ).

Heureusement, c'est une solution facile; fixez vos limites coord_flip()comme ceci:

p + coord_flip(ylim = c(3,5), xlim = c(100, 400))

Cela modifie simplement la plage visible (c'est-à-dire ne supprime pas les points de données).

Facture
la source
J'ai une question similaire mais plus difficile publiée ici stackoverflow.com/questions/61531149/… sur la façon de limiter un seul côté
IVIM