web-dev-qa-db-fra.com

Comment changer le formatage des nombres sur un axe avec ggplot?

J'utilise R et ggplot pour dessiner un diagramme de dispersion de certaines données, tout va bien sauf que les nombres sur l'axe des y sortent avec le formatage des exposants de style informatique, à savoir 4e + 05, 5e + 05, etc. inacceptable, alors je veux le faire afficher 500 000, 400 000, etc. Obtenir une notation correcte de l'exposant serait également acceptable.

Le code pour l'intrigue est comme suit:

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 très appréciée.

111
Jack Aidley

J'ai aussi trouvé une autre façon de faire qui donne la bonne notation 'x10 (exposant) 5' sur les axes. Je l'affiche ici dans l'espoir que cela puisse être utile à certains. J'ai reçu le code de ici , donc je n'en revendique aucun crédit, cela revient à 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) 
55
Jack Aidley

Une autre option est de formater vos étiquettes de ticks d’axe avec des virgules en utilisant le paquetage scales, et d’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)
107
Jim M.
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)
41
DiscreteCircle

Je suis en retard pour le jeu ici, mais au cas où d'autres voudraient une solution facile, j'ai créé un ensemble de fonctions qui peuvent s'appeler comme:

 ggplot + scale_x_continuous(labels = human_gbp)

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

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

15
Feargal Ryan

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

Je voulais jeter une autre option. Supposons que vous avez une série avec beaucoup de petits nombres et que vous voulez vous assurer que les étiquettes des axes écrivent le point décimal complet (par exemple, 5e-05 -> 0,0005), puis:

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) 
8
EconomiCurtis