Transformer un seul axe à l'échelle log10 avec ggplot2
-
11-10-2019 - |
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))
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")
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()
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:
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)
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 ::
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')
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!