Augmenter le nombre de graduations d'axe

203

Je génère des graphiques pour certaines données, mais le nombre de graduations est trop petit, j'ai besoin de plus de précision sur la lecture.

Existe-t-il un moyen d'augmenter le nombre de graduations d'axe dans ggplot2?

Je sais que je peux dire à ggplot d'utiliser un vecteur comme graduations d'axe, mais ce que je veux, c'est augmenter le nombre de graduations, pour toutes les données. En d'autres termes, je veux que le nombre de graduations soit calculé à partir des données.

Peut-être que ggplot le fait en interne avec un algorithme, mais je n'ai pas trouvé comment il le faisait, pour changer selon ce que je veux.

João Daniel
la source

Réponses:

195

Vous pouvez remplacer les échelles par défaut de ggplots en modifiant scale_x_continuouset / ou scale_y_continuous. Par exemple:

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))

ggplot(dat, aes(x,y)) +
  geom_point()

Vous donne ceci:

entrez la description de l'image ici

Et remplacer les échelles peut vous donner quelque chose comme ceci:

ggplot(dat, aes(x,y)) +
  geom_point() +
  scale_x_continuous(breaks = round(seq(min(dat$x), max(dat$x), by = 0.5),1)) +
  scale_y_continuous(breaks = round(seq(min(dat$y), max(dat$y), by = 0.5),1))

entrez la description de l'image ici

Si vous voulez simplement "zoomer" sur une partie spécifique d'un tracé, regardez xlim()et ylim()respectivement. Un bon aperçu peut également être trouvé ici pour comprendre également les autres arguments.

Chasse
la source
4
En fait, le but serait de "généraliser" l' byargument, à différentes échelles de nombres, c'est-à-dire que 0,5 est une bonne valeur pour cette donnée dont la plage est c (-3,3), mais ce n'est pas une bonne plage pour une donnée de quelle plage est c (0,5000). Y a-t-il une fonction qui le calcule?
João Daniel le
3
@ JoãoDaniel - Je veux dire que ggplot fait un travail décent dans ce domaine automatiquement. Si cela ne produit pas un ensemble de résultats satisfaisants, je ne suis pas sûr qu'il existe une fonction intégrée pour fournir quelque chose de différent. Le niveau de détail que vous voudrez sera spécifique à votre tracé, mais réfléchissez peut-être à certains cas de test et au niveau de détail spécifié pour identifier un modèle ... s'il s'agissait d'un boxplot, quelque chose comme max-min/30un "seau" assez courant taille ... mais cela peut ou non être un bon point de départ pour vous.
Chase le
4
Qu'en est-il des valeurs catégorielles sur l'axe des x comme les mois de l'année pour les séries chronologiques?
Scott Davis
3
@ScottDavis jetez un œil au lien . Vous pouvez utiliserscale_x_date(date_breaks = "5 months", date_minor_breaks = "1 months")
Markus Hauschel
1
Pour le zoom coord_cartesiandoit être utilisé à la place de xlim. stackoverflow.com/questions/25685185/…
qwr
182

Sur la base du commentaire de Daniel Krizian , vous pouvez également utiliser la pretty_breaksfonction de la scalesbibliothèque, qui est importée automatiquement:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
scale_y_continuous(breaks = scales::pretty_breaks(n = 10))

Tout ce que vous avez à faire est d'insérer le nombre de ticks souhaité n.


Une solution légèrement moins utile (puisque vous devez spécifier à nouveau la variable de données), vous pouvez utiliser la prettyfonction intégrée:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = pretty(dat$x, n = 10)) +
scale_y_continuous(breaks = pretty(dat$y, n = 10))
slhck
la source
18
C'est clairement la meilleure réponse! Btw ggplot importe déjà scalesmais n'ajoute pas les fonctions à votre espace de noms. Vous pouvez donc les appeler sans l'importation en tant que scales::pretty_breaks(n = 10).
tandis que
66

Vous pouvez fournir un argument de fonction à scale, et ggplot utilisera cette fonction pour calculer les emplacements des graduations.

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))
number_ticks <- function(n) {function(limits) pretty(limits, n)}

ggplot(dat, aes(x,y)) +
  geom_point() +
  scale_x_continuous(breaks=number_ticks(10)) +
  scale_y_continuous(breaks=number_ticks(10))
encombrement
la source
85
Pas besoin de créer sa propre fonction number_ticks. Cela a déjà été mis en œuvre dans pretty_breaks {scales}. D'où: ggplot(dat, aes(x,y)) + geom_point() + scale_x_continuous(breaks=pretty_breaks(n=10)) + scale_y_continuous(breaks=pretty_breaks(n=10))
Daniel Krizian
11
@Daniel Krizian: 1) a besoin de require(scales)2) cela semble empêcher mes ruptures d'apparaître en notation scientifique, donc 1e6 est changé en 1000000 ??
smci
7
Vous pouvez utiliser des R de base prettysans le scalespackage, il suffit de fournir les valeurs comme argument. Par exemple:(breaks=pretty(dat$x, n=10))
Molx
@smci Si ggplot2 fonctionne, des échelles sont disponibles. ggplot2 ne fonctionnera pas sans échelles.
Claus Wilke
12

La prochaine version v3.3.0 de ggplot2aura une option n.breakspour générer automatiquement des pauses pour scale_x_continuousetscale_y_continuous

    devtools::install_github("tidyverse/ggplot2")

    library(ggplot2)

    plt <- ggplot(mtcars, aes(x = mpg, y = disp)) +
      geom_point()

    plt + 
      scale_x_continuous(n.breaks = 5)

entrez la description de l'image ici

    plt + 
      scale_x_continuous(n.breaks = 10) +
      scale_y_continuous(n.breaks = 10)

entrez la description de l'image ici

Tung
la source
5

Aditionellement,

ggplot(dat, aes(x,y)) +
geom_point() +
scale_x_continuous(breaks = seq(min(dat$x), max(dat$x), by = 0.05))

Fonctionne pour les données de l'axe des x échelonnées ou discrètes (c'est-à-dire, arrondi pas nécessaire).

bmc
la source