Descripción del problema
que tengo miles de líneas (~ 4000) que quiero trama. Sin embargo, es inviable para trazar todas las líneas usando geom_line()
y sólo tiene que utilizar por ejemplo alpha=0.1
para ilustrar donde hay una alta densidad de líneas y dónde no. Me encontré con algo similar en Python , especialmente el segundo gráfico de las respuestas se ve muy bien, pero no lo hago ahora, si algo similar puede conseguirse en ggplot2
. Por lo tanto algo como esto:
Un ejemplo de datos
Sería mucho más sentido para demostrar esto con un juego que muestra un patrón, pero por ahora me acaba de generar curvas de los senos al azar:
set.seed(1)
gen.dat <- function(key) {
c <- sample(seq(0.1,1, by = 0.1), 1)
time <- seq(c*pi,length.out=100)
val <- sin(time)
time = 1:100
data.frame(time,val,key)
}
dat <- lapply(seq(1,10000), gen.dat) %>% bind_rows()
Heatmap intentado
He intentado un mapa de calor como aquí la respuesta , sin embargo, este mapa de calor no tendrá en cuenta la conexión de los puntos sobre el eje completa (como en una línea), sino más bien mostrar el "calor" por punto de tiempo.
Pregunta
¿Cómo podemos, en I, utilizando ggplot2
parcela de un mapa de calor de líneas de parecida a la mostrada en la primera figura?
Sus datos dará lugar a una densidad de lunares bastante uniforme.
Me genera unos datos ligeramente más interesantes de esta manera:
gen.dat <- function(key) {
has_offset <- runif(1) > 0.5
time <- seq(1, 1000, length.out = 1000)
val <- sin(time / 100 + rnorm(1, sd = 0.2) + (has_offset * 1.5)) *
rgamma(1, 20, 20)
data.frame(time,val,key)
}
dat <- lapply(seq(1,1000), gen.dat) %>% bind_rows()
A continuación, obtener una estimación de la densidad 2d. kde2d no tiene una predict
función para la modelamos con un loess
dens <- MASS::kde2d(dat$time, dat$val, n = 400)
dens_df <- data.frame(with(dens, expand_grid( y, x)), z = as.vector(dens$z))
fit <- loess(z ~ y * x, data = dens_df, span = 0.02)
dat$z <- predict(fit, with(dat, data.frame(x=time, y=val)))
El trazado se obtiene este resultado a continuación:
ggplot(dat, aes(time, val, group = key, color = z)) +
geom_line(size = 0.05) +
theme_minimal() +
scale_color_gradientn(colors = c("blue", "yellow", "red"))
Todo esto es altamente dependiente de:
- El número de serie
- La resolución de la serie
- La densidad de kde2d
- El lapso de loess
Así que su millaje puede variar