Jolies tiques pour une échelle normale de log en utilisant ggplot2 (dynamic pas manuel)

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:

entrer la description de l'image ici

J’ai aussi essayé:

entrer la description de l'image ici

 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") 

entrer la description de l'image ici

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

entrer la description de l'image ici

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()) 

des pauses à dix puissances

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:

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()) 

entrer la description de l'image ici

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()) 

entrer la description de l'image ici

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:

  1. Les étiquettes des axes sont affichées sous forme de puissances de dix – ce que j’aime
  2. La ligne de quadrillage mineure se trouve au milieu des lignes principales de la grid (comparez ce graphique avec les lignes de la grid dans la réponse d’Andrie).
  3. L’axe des x est plus joli. Pour une raison quelconque dans l’insortinggue d’Andrie, la plage de l’axe des x est différente.

Donner

entrer la description de l'image ici

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") 

entrer la description de l'image ici