Densité ligne heatmap en R

CodeNoob:

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.1pour 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:entrez la description d'image ici

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 ggplot2tracer une carte de répartition des lignes du même type que celle représentée sur la première figure?

Robin Gert Bach:

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 predictfonction , 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"))

entrez la description d'image ici

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

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=370080&siteId=1
conseillé
Classement