164 votes

Comment modifier le formatage des chiffres sur un axe avec ggplot ?

J'utilise R et ggplot pour dessiner un nuage de points de certaines données. Tout va bien, sauf que les nombres sur l'axe des ordonnées sortent avec un formatage d'exposant de style informatique, c'est-à-dire 4e+05, 5e+05, etc. C'est inacceptable pour moi. Je veux donc les afficher sous la forme 500 000, 400 000, etc. L'obtention d'une notation correcte des exposants serait également acceptable.

Le code de la parcelle est le suivant :

p <- ggplot(valids, aes(x=Test, y=Values)) +
  geom_point(position="jitter") +
  facet_grid(. ~ Facet) +
  scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
  scale_x_discrete(name="Test repeat") +
  stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")

Toute aide est la bienvenue.

168voto

Jim M. Points 1883

Une autre option consiste à formater les étiquettes de vos axes avec des virgules en utilisant le paquetage scales et ajouter

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

à votre déclaration ggplot.

Si vous ne voulez pas charger le paquet, utilisez :

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)

83voto

Jack Aidley Points 3993

J'ai également trouvé une autre façon de procéder qui donne une notation correcte de "x10(superscript)5" sur les axes. Je la publie ici dans l'espoir qu'elle puisse être utile à certains. J'ai obtenu le code à partir de ici donc je n'en revendique pas le mérite, qui revient de droit à Brian Diggs.

fancy_scientific <- function(l) {
     # turn in to character string in scientific notation
     l <- format(l, scientific = TRUE)
     # quote the part before the exponent to keep all the digits
     l <- gsub("^(.*)e", "'\\1'e", l)
     # turn the 'e+' into plotmath format
     l <- gsub("e", "%*%10^", l)
     # return this as an expression
     parse(text=l)
}

Que vous pouvez ensuite utiliser comme

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific)

47voto

DiscreteCircle Points 184
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)

18voto

Feargal Ryan Points 454

Je suis en retard sur le jeu ici mais au cas où d'autres veulent une solution facile, j'ai créé un ensemble de fonctions qui peuvent être appelées comme suit :

 ggplot + scale_x_continuous(labels = human_gbp)

qui vous donnent des nombres lisibles par l'homme pour les axes x ou y (ou tout autre nombre en général).

Vous pouvez trouver les fonctions ici : Repo Github Copiez simplement les fonctions dans votre script pour pouvoir les appeler.

12voto

EconomiCurtis Points 994

Je trouve que la réponse proposée par Jack Aidley est utile.

Je voulais proposer une autre option. Supposons que vous avez une série avec beaucoup de petits nombres, et que vous voulez vous assurer que les étiquettes d'axe écrivent le point décimal complet (par exemple 5e-05 -> 0.0005), alors :

NotFancy <- function(l) {
 l <- format(l, scientific = FALSE)
 parse(text=l)
}

ggplot(data = data.frame(x = 1:100, 
                         y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)), 
       aes(x=x, y=y)) +
     geom_point() +
     scale_y_continuous(labels=NotFancy)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X