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.1
para 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 ggplot2
trazar 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"))
ggpointdensity
Mirando 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
ggpointdensity
paquete 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 elmethod
argumento 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
adjust
argumento.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