violin ggplot geom_point geom_line change r plot ggplot2

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:

  1. Las etiquetas de los ejes se muestran como potencias de diez, lo que me gusta
  2. 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).
  3. 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")