geom_point - Bonitas marcas para registrar la escala normal usando ggplot2(dinámico, no manual)
ggplot2 rstudio (3)
Cuando construyo gráficos en la escala de registro, encuentro que los siguientes trabajos funcionan bastante 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)))
Un par de diferencias:
- Las etiquetas de los ejes se muestran como potencias de diez, lo que me gusta
- La línea de cuadrícula menor está en el medio de las líneas principales de la cuadrícula (compara esta gráfica con las líneas de la cuadrícula en la respuesta de Andrie).
- El eje x es más agradable. Por alguna razón en la trama de Andrie, el rango del eje x es diferente.
Dar
Intento usar ggplot2 para crear un gráfico de rendimiento con una escala de log normal y. Lamentablemente, no puedo producir tics agradables en cuanto a la función de trazado base.
Aquí mi ejemplo:
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())
produce garrapatas feas:
También probé:
ggplot(M,aes(x=X,y=Y)) + geom_line() +
scale_y_continuous(trans=log_trans(), breaks=pretty_breaks())
¿Cómo puedo obtener los mismos cortes / ticks que en la función de trazado predeterminado?
plot(M,type="l",log="y")
El resultado debería verse así, pero no con tipeo duro, sino dinámico. Intenté funciones como axisTicks()
pero no fue exitoso:
ggplot(M,aes(x=X,y=Y)) + geom_line() +
scale_y_continuous(trans=log_trans(), breaks=c(1,10,100,10000))
¡Gracias!
editar: imágenes insertadas
El comportamiento de los gráficos base se puede reproducir utilizando una función de interrupción personalizada:
base_breaks <- function(n = 10){
function(x) {
axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n)
}
}
Aplicar esto a los datos de ejemplo da el mismo resultado que usar 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())
Sin embargo, podemos usar la misma función en un subconjunto de los datos, con valores y entre 50 y 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())
Como los poderes de diez ya no son adecuados aquí, base_breaks
produce breaks bonitos alternativos:
Tenga en cuenta que he desactivado líneas de cuadrícula menores: en algunos casos, tendría sentido tener líneas de cuadrícula a medio camino entre las líneas principales de la cuadrícula en el eje y, pero no siempre.
Editar
Supongamos que modificamos M de modo que el valor mínimo sea 0.1:
M <- M - min(M) + 0.1
La función base_breaks () sigue seleccionando breaks bonitos, pero las etiquetas están en notación científica, que pueden no verse como "bonitas":
ggplot(M, aes(x = X, y = Y)) + geom_line() +
scale_y_continuous(trans = log_trans(), breaks = base_breaks()) +
theme(panel.grid.minor = element_blank())
Podemos controlar el formato del texto pasando una función de formato de texto al argumento de las labels
de scale_y_continuous
. En este caso, prettyNum
del paquete base funciona bien:
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())
La función de gráficos base axTicks()
devuelve los saltos de eje para el trazado actual. Por lo tanto, puede usar esto para devolver saltos idénticos a los gráficos base. El único inconveniente es que primero debe trazar la gráfica de gráficos 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")