Czekam na tworzenie wielu wykresów gęstości, aby utworzyć "animowaną mapę ciepła".Określanie skali dla gęstości w ggplot2's stat_density2d
Ponieważ każda klatka animacji powinna być porównywalna, chciałbym, aby gęstość -> odwzorowanie kolorów na każdym wykresie było takie samo dla wszystkich z nich, nawet jeśli zakres danych zmienia się dla każdego z nich.
Oto kod użyję dla każdego wykresu:
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)
Wyobraź Używam tego samego kodu, ale „this_df” zmian na każdej klatce. Tak więc na jednym wykresie może być gęstość w zakresie od 0 do 4e-4. Na innej gęstości wynosi od 0 do 4e-2.
Domyślnie ggplot obliczy wyraźną gęstość -> mapowanie kolorów dla każdego z nich. Ale to oznaczałoby, że dwa wykresy - dwie klatki animacji - nie są naprawdę porównywalne. Gdyby to był histogram lub wykres gęstości, po prostu zadzwoniłbym do coord_cartesian i zmienił x i y lim. Ale w przypadku wykresu gęstości nie mam pojęcia, jak zmienić skalę.
Najbliżej udało mi się znaleźć to:
Overlay two ggplot2 stat_density2d plots with alpha channels
Ale nie mam możliwość oddania dwóch działek gęstości na tym samym wykresie, ponieważ chcę je za odrębne klatki.
Każda pomoc będzie ogromnie doceniona!
EDIT:
Oto powtarzalne przykład:
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
Mapujesz symbol "alfa" na poziom, a nie kolor. Możesz kontrolować skalę alfa, dodając 'scale_alpha_continuous (limits = ...)' gdzie 'limits' jest wektorem określającym limity w jednostkach' ..level..', więc (0,4e-2) Przypuszczam. Jeśli podasz swój zestaw danych, ktoś może chcieć udzielić Ci dalszej pomocy. – jlhoward
Dzięki za odpowiedź! Dodałem powtarzalny kod z fałszywymi danymi (nie mogę udostępnić prawdziwych danych). Zauważ, że jeśli dodasz, powiedz '+ scale_alpha_continuous (limits = c (0, 2e-6))' na końcu tego kodu, spowoduje to, że skalowanie alfa będzie ciągłe, ale NIE naprawi konturów. W jaki sposób można uzyskać skalowanie konturu na dwóch wykresach? – jwdink
Mówisz, że chcesz wykreślić kontury dla tych samych wartości .. .. .. na obu polach? Jeśli tak, to użyj 'breaks = ...' w 'stat_density2d (...)'. – jlhoward