2013-06-09 28 views
6

Khi sử dụng chức năng geom_tilefacet_wrap với nhau trong ggplot2, làm thế nào để thiết lập giới hạn khác nhau của thẩm mỹ fill, như tùy chọn scales có thể được thiết lập để được free/free_y/free_x trong facet_wrap?Vary quy mô điền khi sử dụng facet_wrap và geom_tile cùng

Sau đây là ví dụ để hiển thị sự cố. Đối với khác nhau type trong data.frame df, phạm vi của z có thể rất khác nhau. Nếu chúng ta sử dụng cùng một giới hạn của thẩm mỹ fill, một số panle, mà một trong những phần z có giá trị rất nhỏ, sẽ rất khó để xem chi tiết.

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

Không có máy tính, nhưng bạn đã thử đối số 'thu gọn' chưa? – geotheory

+0

bạn sẽ cần một huyền thoại khác nhau cho mỗi khía cạnh, điều đó không thực sự tương thích với khung công tác ggplot2. Bạn có thể dễ dàng tạo ra các ô độc lập và sắp xếp chúng lại với nhau. – baptiste

Trả lời

2

Một cách để giải quyết vấn đề này là chuẩn hóa biến điền, sao cho tỷ lệ tương tự cho tất cả các khía cạnh.

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") 

Tôi muốn có bất kỳ thứ gì như fill=std(z) để tôi không phải chuẩn hóa thủ công.

2

Tôi biết đây là vấn đề cũ, nhưng gần đây tôi đã gặp phải vấn đề tương tự và đã đưa ra giải pháp này mà tôi muốn chia sẻ. Bí quyết là để thu thập các bộ dữ liệu cần thiết cho việc geom_tile() lô cá nhân trong một dataframe lồng nhau sử dụng nest() từ tidyr và sau đó sử dụng map2() chức năng từ purrr gói và một hàm wrapper để tạo ra các âm mưu cá nhân:

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

các dataframe lồng chứa hai danh sách-cột, có chứa các tập hợp dữ liệu và lô:

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

Từ đây, rất dễ sửa đổi plot_func() để tinh chỉnh các ô.

Các vấn đề liên quan