2014-07-19 12 views
5

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 
+0

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

+0

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

+0

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

Odpowiedz

7

więc mieć oba wykresy pokazują kontury tych samych poziomach, należy użyć argumentu breaks=... w stat_densit2d(...). Aby mieć oba wykresy z tym samym odwzorowaniem alfa na poziom, użyj scale_alpha_continuous(limits=...).

Oto pełny kod wykazać:

library(ggplot2) 
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)), 
        breaks=1e-6*seq(0,10,by=2),geom="contour", bins=4, size= 2)+ 
    scale_alpha_continuous(limits=c(0,1e-5))+ 
    scale_color_discrete("Condition") 
} 
library(gridExtra) 
do.call(grid.arrange,c(g,ncol=2)) 

A wynik ...

+1

To jest rozwiązanie, którego potrzebowałem dzisiaj. Uruchomiłem kod i stwierdziłem, że 'stat_density2d' nie przyjmuje' breaks' z bieżącym ggplot2 (ggplot2_2.1.0). Czy możesz wymyślić inny sposób osiągnięcia tego samego efektu? – jazzurro

7

chciałbym zostawić aktualizacji dla tej kwestii. Od lipca 2016 roku stat_density2d nie zajmuje już więcej czasu niż breaks. Aby odtworzyć grafikę, musisz przenieść breaks=1e-6*seq(0,10,by=2) do scale_alpha_continuous().

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) + 
     scale_alpha_continuous(limits=c(0,1e-5), breaks=1e-6*seq(0,10,by=2))+ 
     scale_color_discrete("Condition") 
    } 

do.call(grid.arrange,c(g,ncol=2)) 
Powiązane problemy