Description du problème
que j'ai des milliers de lignes (~ 4000) que je veux intrigue. Cependant , il est impossible de tracer toutes les lignes à l' aide geom_line()
et il suffit d' utiliser par exemple alpha=0.1
pour illustrer où il y a une forte densité de lignes et où non. Je suis tombé sur quelque chose de similaire en Python , en particulier la deuxième représentation graphique des réponses air vraiment sympa, mais je ne le fais pas maintenant , si quelque chose de semblable peut être réalisé ggplot2
. Ainsi , quelque chose comme ceci:
Un ensemble de données exemple
Il serait logique beaucoup plus à démontrer avec un ensemble montrant un modèle, mais pour l' instant je viens généré des courbes de sinus aléatoires:
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()
Essayé heatmap
J'ai essayé un heatmap comme une réponse ici , mais ce heatmap ne considérera pas la connexion des points sur l'axe complet (comme dans une ligne) , mais plutôt montrer la « chaleur » par point de temps.
Question
Comment pouvons - nous en R, en utilisant ggplot2
tracer une carte de répartition des lignes du même type que celle représentée sur la première figure?
Vos données se traduira par une densité de polkadot assez uniforme.
Je généré des données un peu plus intéressantes comme celle-ci:
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()
On obtient alors une estimation de densité 2d. kde2d ne dispose pas d' une predict
fonction , donc nous avons un modèle avec 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)))
Traçage il obtient alors ce résultat:
ggplot(dat, aes(time, val, group = key, color = z)) +
geom_line(size = 0.05) +
theme_minimal() +
scale_color_gradientn(colors = c("blue", "yellow", "red"))
Tout cela est très dépendante de:
- Le nombre de séries
- La résolution de la série
- La densité de kde2d
- La durée de loess
de sorte que votre kilométrage peut varier