2011-08-09 17 views
7

Używam ggplot's geom_tile do tworzenia wykresów gęstości 2-D fasetowanych przez współczynnik. Skala każdego aspektu przechodzi od minimum wszystkich danych do maksimum wszystkich danych, ale geom_tile w każdym aspekcie rozciąga się tylko do zakresu danych wykreślonych w tym aspekcie.Jak mogę zmusić ggplot do geom_tile do wypełnienia każdego aspektu?

przykład kodu, który pokazuje problem:

library(ggplot2) 

data.unlimited <- data.frame(x=rnorm(500), y=rnorm(500)) 
data.limited <- subset(data.frame(x=rnorm(500), y=rnorm(500)), x<1 & y<1 & x>-1 & y>-1) 

mydata <- rbind(data.frame(groupvar="unlimited", data.unlimited), 
       data.frame(groupvar="limited", data.limited)) 

ggplot(mydata) + 
    aes(x=x,y=y) + 
    stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) + 
    facet_wrap(~ groupvar) 

facet

uruchomić kod i widać dwa aspekty. Jeden aspekt pokazuje wykres gęstości o "nieograniczonym" losowym rozkładzie normalnym. Drugi aspekt pokazuje losową normalną skróconą, by leżeć w kwadracie 2x2 wokół miejsca pochodzenia. Element geom_tile w "ograniczonym" elemencie będzie zamknięty wewnątrz tego małego pudełka zamiast wypełniania aspektu.

last_plot() + 
    scale_x_continuous(limits=c(-5,5)) + 
    scale_y_continuous(limits=c(-5,5)) 

specified limits

te ostatnie trzy linie wykreślić samych danych o określonych granicach X i Y, i widać, że nie wystaje ścianka sekcji płytki do krawędzi w tym przypadku.

Czy istnieje sposób na wymuszenie geom_tile w każdym aspekcie, aby rozszerzyć się do pełnego zakresu aspektu?

Odpowiedz

14

myślę szukasz kombinacji scales = "free" i expand = c(0,0):

ggplot(mydata) + 
    aes(x=x,y=y) + 
    stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) + 
    facet_wrap(~ groupvar,scales = "free") + 
    scale_x_continuous(expand = c(0,0)) + 
    scale_y_continuous(expand = c(0,0)) 

enter image description here

EDIT

Given wyjaśnienie PO, oto jedna opcja poprzez po prostu ustawienie panelu ręcznie:

ggplot(mydata) + 
    aes(x=x,y=y) + 
    stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) + 
    facet_wrap(~ groupvar) + 
    scale_fill_gradient(low = "blue", high = "red") + 
    opts(panel.background = theme_rect(fill = "blue"),panel.grid.major = theme_blank(), 
     panel.grid.minor = theme_blank()) 

enter image description here

+0

Nie, chcę, aby wszystkie aspekty miały tę samą skalę. Zasadniczo chcę po prostu brył niebieski poza polem 2x2 po ograniczonej stronie, aby wskazać, że tam jest zerowa gęstość. Innymi słowy, nie chcę, aby skala zmniejszała się do zakresu danych, po prostu chcę pokryć cały obszar geom_tile bez zmiany skali. –

+0

W takim przypadku lepiej jest ustawić ręcznie tło panelu. Zaktualizuję przykład ... – joran

+0

@Ryan - Możesz również zajrzeć [tutaj] (http://stackoverflow.com/questions/6906661/ggplot2-make-missing-value-in-geom-tile-not- puste) dla innej opcji, chociaż uważam, że zakładasz, że masz wartości gęstości w ręku. – joran

Powiązane problemy