Question

J'ai le problème suivant: Je voudrais visualiser un discret et une variable continue sur un boxplot dans lequel celui-ci a quelques valeurs extrêmes de haut. Cela rend le sens boxplot (les points, et même le « corps » de la carte est trop petit), c'est pourquoi je voudrais montrer à l'échelle log10. Je suis conscient que je pouvais laisser les valeurs extrêmes de la visualisation, mais je ne suis pas l'intention.

Voyons voir un exemple simple avec des données de diamants:

m <- ggplot(diamonds, aes(y = price, x = color))

text alt

Le problème est pas grave, mais je l'espère, vous pouvez imaginer pourquoi je voudrais voir les valeurs à l'échelle de log10. Essayons:

m + geom_boxplot() + coord_trans(y = "log10")

text alt

Comme vous pouvez le voir l'axe y est log10 mis à l'échelle et a l'air bien, mais il y a un problème avec l'axe x, ce qui rend l'intrigue très étrange.

Le problème ne se produit pas avec scale_log, mais ce n'est pas une option pour moi , comme je ne peux pas utiliser formatter cette façon personnalisée. Par exemple:.

m + geom_boxplot() + scale_y_log10() 

text alt

Ma question: quelqu'un sait une solution pour tracer la boxplot avec échelle log10 sur l'axe y qui étiquettes peuvent être librement mis en forme avec une fonction formatter comme dans cette fil ?


Modification de la question à answerers d'aide en fonction des réponses et commentaires:

Ce que je suis vraiment après: un axe transformé log10 (y) avec des étiquettes non scientifiques. Je voudrais l'étiqueter comme (formatter=dollar) dollar ou tout format personnalisé.

Si je tente @ suggestion de hadley je reçois les avertissements suivants:

> m + geom_boxplot() + scale_y_log10(formatter=dollar)
Warning messages:
1: In max(x) : no non-missing arguments to max; returning -Inf
2: In max(x) : no non-missing arguments to max; returning -Inf
3: In max(x) : no non-missing arguments to max; returning -Inf

Avec un axe Y inchangée étiquettes:

text alt

Était-ce utile?

La solution

Le plus simple est de simplement donner l'argument « trans » (anciennement « formatter » le nom de la fonction journal:

m + geom_boxplot() + scale_y_continuous(trans='log10')

EDIT: Ou si vous ne le faites pas comme ça, alors l'un de ces derniers semble donner des résultats différents, mais utiles:

m <- ggplot(diamonds, aes(y = price, x = color), log="y")
m + geom_boxplot() 
m <- ggplot(diamonds, aes(y = price, x = color), log10="y")
m + geom_boxplot()

EDIT2 & 3: D'autres expériences (après avoir jeté celui qui a tenté avec succès à mettre « $ » signes devant des valeurs enregistrées):

fmtExpLg10 <- function(x) paste(round_any(10^x/1000, 0.01) , "K $", sep="")
ggplot(diamonds, aes(color, log10(price))) + 
  geom_boxplot() + 
  scale_y_continuous("Price, log10-scaling", trans = fmtExpLg10)

text alt

Note ajoutée mi 2017 dans le commentaire sur le changement de syntaxe du package:

  

scale_y_continuous (= formatter 'log10') est maintenant scale_y_continuous (trans = 'log10') (ggplot2 v2.2.1)

Autres conseils

J'ai eu un problème similaire et cette échelle a fonctionné pour moi comme un charme:

breaks = 10**(1:10)
scale_y_log10(breaks = breaks, labels = comma(breaks))

que vous voulez que les niveaux intermédiaires, aussi (10 ^ 3.5), vous devez modifier la mise en forme:

breaks = 10**(1:10 * 0.5)
m <- ggplot(diamonds, aes(y = price, x = color)) + geom_boxplot()
m + scale_y_log10(breaks = breaks, labels = comma(breaks, digits = 1))

Après l'exécution ::

entrer image description ici

Une autre solution utilisant scale_y_log10 avec trans_breaks, trans_format et annotation_logticks()

library(ggplot2)

m <- ggplot(diamonds, aes(y = price, x = color))

m + geom_boxplot() +
  scale_y_log10(
    breaks = scales::trans_breaks("log10", function(x) 10^x),
    labels = scales::trans_format("log10", scales::math_format(10^.x))
  ) +
  theme_bw() +
  annotation_logticks(sides = 'lr') +
  theme(panel.grid.minor = element_blank())

Je pense que je l'ai eu enfin en faisant quelques transformations manuelles avec les données avant la visualisation:

d <- diamonds
# computing logarithm of prices
d$price <- log10(d$price)

Et un travail formatter plus tard Compute « retour » des données logarithmiques:

formatBack <- function(x) 10^x 
# or with special formatter (here: "dollar")
formatBack <- function(x) paste(round(10^x, 2), "$", sep=' ') 

Et dessiner le terrain avec formatter donné:

m <- ggplot(d, aes(y = price, x = color))
m + geom_boxplot() + scale_y_continuous(formatter='formatBack')

text alt

Désolé de la communauté pour vous embêter avec une question que je aurais pu résoudre avant! La partie drôle est: je travaillais dur pour faire ce travail de terrain il y a un mois, mais n'a pas réussi. Après avoir posé ici, je l'ai eu.

Quoi qu'il en soit, grâce à @DWin pour la motivation!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top