Sto cercando di creare grafici a densità multipla, per creare una "mappa di calore animata".Specifica la scala per la densità in ggplot2 stat_density2d
Dato che ogni fotogramma dell'animazione dovrebbe essere comparabile, mi piacerebbe che la densità -> la mappatura del colore su ciascun grafico sia uguale per tutti, anche se l'intervallo dei dati cambia per ognuno.
Ecco il codice che userei per ogni singolo grafico:
ggplot(data= this_df, aes(x=X, y=Y)) +
geom_point(aes(color= as.factor(condition)), alpha= .25) +
coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + scale_y_reverse() +
stat_density2d(mapping= aes(alpha = ..level..), geom="polygon", bins=3, size=1)
Immaginate io uso questo stesso codice, ma '' this_df modifiche su ogni fotogramma. Quindi in un grafico, forse la densità varia da 0 a 4e-4. Su un altro, la densità varia da 0 a 4e-2.
Per impostazione predefinita, ggplot calcolerà una densità distinta -> mappatura del colore per ciascuno di questi. Ma questo significherebbe che i due grafici - i due fotogrammi dell'animazione - non sono davvero comparabili. Se questo fosse un grafico dell'istogramma o della densità, farei semplicemente una chiamata a coord_cartesian e cambi il x e y lim. Ma per la trama della densità, non ho idea di come cambiare la scala.
Il più vicino che ho trovato è questo:
Overlay two ggplot2 stat_density2d plots with alpha channels
Ma non hanno la possibilità di mettere i due lotti di densità sullo stesso grafico, dal momento che voglio che siano fotogrammi distinti.
Qualsiasi aiuto sarebbe molto apprezzato!
EDIT:
Ecco un esempio riproducibile:
set.seed(4)
g = list(NA,NA)
for (i in 1:2) {
sdev = runif(1)
X = rnorm(1000, mean = 512, sd= 300*sdev)
Y = rnorm(1000, mean = 384, sd= 200*sdev)
this_df = as.data.frame(cbind(X = X,Y = Y, condition = 1:2))
g[[i]] = ggplot(data= this_df, aes(x=X, y=Y)) +
geom_point(aes(color= as.factor(condition)), alpha= .25) +
coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + scale_y_reverse() +
stat_density2d(mapping= aes(alpha = ..level.., color= as.factor(condition)), geom="contour", bins=4, size= 2)
}
print(g) # level has a different scale for each
Stai mappando 'alpha' sul livello, non sul colore. Puoi controllare la scala alfa aggiungendo 'scale_alpha_continuous (limits = ...)' dove 'limits' è un vettore che specifica i limiti in unità di' ..level..', quindi (0,4e-2) suppongo. Se fornisci il tuo set di dati, qualcuno potrebbe essere disposto a darti più aiuto. – jlhoward
Grazie per la risposta! Ho aggiunto codice riproducibile con dati falsi (non posso condividere i dati reali). Notate che se aggiungete, diciamo '+ scale_alpha_continuous (limits = c (0, 2e-6))' alla fine di questo codice, rende continuo il ridimensionamento alfa, ma NON aggiusta i contorni. Come posso rendere il ridimensionamento del contorno coerente tra i due grafici? – jwdink
Stai dicendo che vuoi tracciare contorni per gli stessi valori di .. livello ... in entrambi i grafici? Se è così, allora usa 'breaks = ...' in 'stat_density2d (...)'. – jlhoward