J’essaie d’utiliser ggplot2 pour créer un graphique de performances avec une échelle de journal normale. Malheureusement, je ne suis pas capable de produire de jolis coups comme pour la fonction de base.
Voici mon exemple:
library(ggplot2) library(scales) # fix RNG set.seed(seed=1) # simulate returns y=rnorm(999,0.02,0.2) # M$Y are the cummulative returns (like an index) M=data.frame(X=1:1000,Y=100) for (i in 2:1000) M[i,"Y"]=M[i-1,"Y"]*(1+y[i-1]) ggplot(M,aes(x=X,y=Y))+geom_line()+scale_y_continuous(trans=log_trans())
produit des tiques laides:
J’ai aussi essayé:
ggplot(M,aes(x=X,y=Y)) + geom_line() + scale_y_continuous(trans=log_trans(), breaks=pretty_breaks())
Comment puis-je obtenir les mêmes pauses / ticks que dans la fonction de tracé par défaut:
plot(M,type="l",log="y")
Le résultat devrait ressembler à ceci, mais pas avec les raccourcis, mais dynamic. J’ai essayé des fonctions comme axisTicks()
mais n’a pas réussi:
ggplot(M,aes(x=X,y=Y)) + geom_line() + scale_y_continuous(trans=log_trans(), breaks=c(1,10,100,10000))
Merci!
edit: images insérées
Le comportement graphique de base peut être reproduit à l’aide d’une fonction de pause personnalisée:
base_breaks <- function(n = 10){ function(x) { axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n) } }
Appliquer ceci aux exemples de données donne le même résultat qu'avec trans_breaks('log10', function(x) 10^x)
:
ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + theme(panel.grid.minor = element_blank())
Cependant, nous pouvons utiliser la même fonction sur un sous-dataset, avec des valeurs y comsockets entre 50 et 600:
M2 <- subset(M, Y > 50 & Y < 600) ggplot(M2, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + theme(panel.grid.minor = element_blank())
Comme les puissances de dix ne sont plus adaptées ici, base_breaks
produit de jolies pauses:
Notez que j'ai désactivé les lignes de quadrillage mineures: dans certains cas, il serait judicieux d'avoir des lignes de grid à mi-chemin entre les lignes principales de l'axe des ordonnées, mais pas toujours.
modifier
Supposons que nous modifions M pour que la valeur minimale soit 0,1:
M <- M - min(M) + 0.1
La fonction base_breaks () sélectionne toujours de jolies ruptures, mais les étiquettes sont en notation scientifique, ce qui peut ne pas être considéré comme "joli":
ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + theme(panel.grid.minor = element_blank())
Nous pouvons contrôler la mise en forme du texte en transmettant une fonction de mise en forme du texte à l'argument labels
de scale_y_continuous
. Dans ce cas, prettyNum
du package de base fait le travail correctement:
ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks(), labels = prettyNum) + theme(panel.grid.minor = element_blank())
Lorsque je construis des graphiques sur l’échelle du journal, je trouve que les travaux suivants fonctionnent plutôt bien:
g = ggplot(M,aes(x=X,y=Y)) + geom_line() g + scale_y_continuous(trans = 'log10', breaks = trans_breaks('log10', function(x) 10^x), labels = trans_format('log10', math_format(10^.x)))
Quelques différences:
Donner
La fonction graphique de base axTicks()
renvoie les ruptures d’axe pour le tracé en cours. Donc, vous pouvez l’utiliser pour renvoyer des pauses identiques aux graphiques de base. Le seul inconvénient est que vous devez d’abord tracer le graphique de base.
library(ggplot2) library(scales) plot(M, type="l",log="y") breaks <- axTicks(side=2) ggplot(M,aes(x=X,y=Y)) + geom_line() + scale_y_continuous(breaks=breaks) + coord_trans(y="log")