2013-06-09 15 views
6

Podczas używania funkcji geom_tile i facet_wrap razem w ggplot2, jak ustawić różne limity estetycznego fill, jako opcja scales które mogą być ustawione free/free_y/free_x w facet_wrap?Vary skalę wypełnienia przy użyciu facet_wrap i geom_tile razem

Poniższy przykład ilustruje problem. Dla różnych type w data.frame df, zakres z może być tak różny. Jeśli użyjemy tych samych ograniczeń estetycznych: fill, niektóre panele, których jedna część ma bardzo małą wartość, będą trudne do zobaczenia.

pp <- function (n,r=4) { 
    x <- seq(-r*pi, r*pi, len=n) 
    df <- expand.grid(x=x, y=x) 
    df$r <- sqrt(df$x^2 + df$y^2) 
    df$z <- cos(df$r^2)*exp(-df$r/6) 
    df 
} 
tmp <- pp(20) 
tmp$type <- rep(1:4,each=nrow(tmp)/4) 
tmp$z <- tmp$z*(10^(tmp$type)) 
ggplot(tmp,aes(x,y))+geom_tile(aes(fill=z))+facet_wrap(~type,scales="free") 
+0

Nie na komputerze, ale czy próbowałeś argumentu 'shrink'? – geotheory

+0

potrzebowałbyś innej legendy dla każdego aspektu, który nie jest naprawdę kompatybilny ze strukturą ggplot2. Można z łatwością wytwarzać niezależne działki i łączyć je ze sobą. – baptiste

Odpowiedz

2

Jednym ze sposobów rozwiązania tego problemu jest standaryzacja zmiennej wypełnienia, tak aby skala była podobna dla wszystkich aspektów.

library(dplyr) 
tmp1 <- group_by(tmp,type) # grouping the data by type 
tmp2 <- mutate(tmp1, z1 = (z-mean(z))/sd(z)) #groupwise standardization 
ggplot(tmp2,aes(x,y))+geom_tile(aes(fill=z1))+facet_wrap(~type,scales="free") 

Szkoda, że ​​nie było czegoś podobnego fill=std(z) tak, że nie trzeba ręcznie standaryzacji.

2

Wiem, że to stary problem, ale ostatnio miałem ten sam problem i wymyśliłem to rozwiązanie, które chciałem udostępnić. Sztuką jest gromadzenie zbiorów danych potrzebnych do indywidualnych geom_tile() działek w zagnieżdżonych dataframe użyciu nest() z tidyr a następnie użyć map2() funkcji z pakietu purrr i funkcji otoki, aby utworzyć poszczególne działki:

library(tidyverse) 

pp <- function (n,r=4) { 
    x <- seq(-r*pi, r*pi, len=n) 
    df <- expand.grid(x=x, y=x) 
    df$r <- sqrt(df$x^2 + df$y^2) 
    df$z <- cos(df$r^2)*exp(-df$r/6) 
    df 
} 
tmp <- pp(20) 
tmp$type <- rep(1:4,each=nrow(tmp)/4) 
tmp$z <- tmp$z*(10^(tmp$type)) 

plot_func <- function(df, name) { 
    ggplot(data = df, aes(x = x, y = y, fill = z)) + 
    geom_tile() + 
    scale_fill_continuous(name = name) 
} 

nested_tmp <- tmp %>% 
    group_by(type) %>% 
    nest() %>% 
    mutate(plots = map2(data, type, plot_func)) 

gridExtra::grid.arrange(grobs = nested_tmp$plots) 

Grid-plot of maps with different color scale

zagnieżdżona dataframe zawiera dwie list-kolumny, które zawierają zestawy danych i działek:

> nested_tmp 
# A tibble: 4 × 3 
    type    data plots 
    <int>    <list> <list> 
    1  1 <tibble [100 × 4]> <S3: gg> 
    2  2 <tibble [100 × 4]> <S3: gg> 
    3  3 <tibble [100 × 4]> <S3: gg> 
    4  4 <tibble [100 × 4]> <S3: gg>  

Stąd bardzo łatwo jest zmodyfikować plot_func(), aby dostroić wykresy.