Descripción del problema
Tengo miles de líneas (~ 4000) que quiero trazar. Sin embargo, no es factible trazar todas las líneas usando geom_line()y solo usar, por ejemplo, alpha=0.1para ilustrar dónde hay una alta densidad de líneas y dónde no. Encontré algo similar en Python , especialmente la segunda trama de las respuestas se ve muy bien, pero ahora no sé si se puede lograr algo similar ggplot2. Entonces algo como esto:

Un conjunto de datos de ejemplo
Tendría mucho más sentido demostrar esto con un conjunto que muestra un patrón, pero por ahora solo generé curvas sinusales aleatorias:
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()
Probé un mapa de calor Probé
un mapa de calor como el que he respondido aquí , sin embargo, este mapa de calor no considerará la conexión de puntos sobre el eje completo (como en una línea), sino que mostrará el "calor" por punto de tiempo.
Pregunta
¿Cómo podemos en R, usando ggplot2trazar un mapa de calor de líneas similares al que se muestra en la primera figura?


ggplot(dat, aes(time, val, group=key)) +stat_pointdensity(geom = "line", size = 0.05, adjust = 10) + scale_color_gradientn(colors = c("blue", "yellow", "red"))ggpointdensityMirando de cerca, uno puede ver que el gráfico al que está vinculando consiste en muchos, muchos, muchos puntos en lugar de líneas.
El
ggpointdensitypaquete hace una visualización similar. Tenga en cuenta que con tantos puntos de datos, hay bastantes problemas de rendimiento. Estoy usando la versión de desarrollador, porque contiene elmethodargumento que permite usar diferentes estimadores de suavizado y aparentemente ayuda a lidiar mejor con números más grandes. También hay una versión CRAN.Puede ajustar el suavizado con el
adjustargumento.He aumentado la densidad del intervalo x de su código, para que se vea más como líneas. Sin embargo, he reducido ligeramente el número de 'líneas' en la trama.
Creado en 2020-03-19 por el paquete reprex (v0.3.0)
actualización Gracias al usuario Robert Gertenbach por crear algunos datos de muestra más interesantes . Aquí el uso sugerido de ggpointdensity en estos datos:
Creado en 2020-03-24 por el paquete reprex (v0.3.0)
fuente
ggplot(dat, aes(time, val, group=key)) +stat_pointdensity(geom = "line", size = 0.05, adjust = 10) + scale_color_gradientn(colors = c("blue", "yellow", "red"))resultados en algo realmente guapo!Se me ocurrió la siguiente solución, usando
geom_segment(), sin embargo, no estoy seguro de sigeom_segment()es el camino a seguir, ya que solo comprueba si los valores por pares son exactamente iguales, mientras que en un mapa de calor (como en mi pregunta) los valores cercanos también afectan el "calor" en lugar de ser exactamente lo mismo.fuente