2012-11-30 41 views
5

Nếu tôi có một yếu tố lồng nhau, trong trường hợp này tôi có nhiều "Gia đình" mức được chứa trong các yếu tố "Order", tôi muốn có khả năng tạo ra mộtcốt truyện khía cạnh lồng nhau với ggplot2

facet_grid(Family/Order ~.) 

thay của hiện tại

facet_grid(Family + Order ~.) 

Về cơ bản - MỘT dải cho mỗi Đơn đặt hàng - chứa bên cạnh tất cả các dải cho mỗi gia đình bên trong Đơn hàng đó. Tôi biết rằng facet_grid (Gia đình/Đặt hàng ~.) Hiện không thể thực hiện được, nhưng làm thế nào tôi có thể đạt được hiệu ứng này? Nó có thể được thực hiện với một chủ đề()? Cảm ơn bạn rất nhiều. --SB

Tôi phải nêu rõ rằng cả Gia đình và Đơn đặt hàng đều là các yếu tố. Các giá trị dữ liệu B là bởi các loài có cấp độ gia đình và cấp độ đơn hàng mà chúng thuộc về. Dưới đây là mã cho cốt truyện của tôi:

p <- ggplot(models, aes(B,Species)) + geom_point() + facet_grid(Family + Order ~ 
.,scales="free",space="free") 

Dưới đây là một số dữ liệu mẫu:

structure(list(Species = c("Acanthocyclops robustus", "Acroperus harpae", 
"Alona affinis", "Ascaphus truei", "Bosmina longirostris"), Intercept = c(-36.1182388331068, 
-27.2140776216155, -25.7920464721491, -39.2233884219763, -31.4301301084581 
), B = c(0.919397836908493, 0.716601987210452, 0.685455190113372, 
1.04159758611351, 0.81077051300147), Bconf = c(0.407917065756464, 
0.181611850119198, 0.254101713856315, 0.708582768458448, 0.234313394549538 
), Order = c("Cyclopoida", "Diplostraca", "Diplostraca", "Anura", 
"Diplostraca"), Family = c("Cyclopidae", "Chydoridae", "Chydoridae", 
"Leiopelmatidae", "Bosminidae")), .Names = c("Species", "Intercept", 
"B", "Bconf", "Order", "Family"), row.names = c(NA, 5L), class = "data.frame") 
+2

Bạn nên đăng một số mã với điều này là một ví dụ. Từ cách bạn mô tả nó, thật khó để thấy làm thế nào 'facet_grid (Order ~ Family)' sẽ không cung cấp cho bạn đầu ra mà bạn muốn. – emhart

+0

Tôi đã đăng thêm chi tiết ở trên. Cảm ơn. – user1536207

+2

Vui lòng cung cấp tập dữ liệu mẫu. Không thể trả lời câu hỏi của bạn mà không có một số thông tin về cấu trúc dữ liệu của bạn. –

Trả lời

0

Sử dụng facet_grid hoặc facet_wrap sẽ không xây dựng đồ họa bạn đang cố gắng để xây dựng. Tuy nhiên, bạn có thể xây dựng danh sách đồ họa và sau đó vẽ chúng qua gridEtrax::grid.arrange. Dưới đây là một ví dụ

library(ggplot2) 
library(gridExtra) 
library(dplyr) 

dat <- 
    structure(list(Species = c("Acanthocyclops robustus", "Acroperus harpae", 
    "Alona affinis", "Ascaphus truei", "Bosmina longirostris"), Intercept = c(-36.1182388331068, 
    -27.2140776216155, -25.7920464721491, -39.2233884219763, -31.4301301084581 
), B = c(0.919397836908493, 0.716601987210452, 0.685455190113372, 
    1.04159758611351, 0.81077051300147), Bconf = c(0.407917065756464, 
    0.181611850119198, 0.254101713856315, 0.708582768458448, 0.234313394549538 
), Order = c("Cyclopoida", "Diplostraca", "Diplostraca", "Anura", 
    "Diplostraca"), Family = c("Cyclopidae", "Chydoridae", "Chydoridae", 
    "Leiopelmatidae", "Bosminidae")), .Names = c("Species", "Intercept", 
    "B", "Bconf", "Order", "Family"), row.names = c(NA, 5L), class = "data.frame") 

dat 

# A ggplot object with NO data. Omit the order from the facet_grid call 
g <- 
    ggplot() + 
    aes(Species, B) + 
    geom_point() + 
    facet_grid(. ~ Family, 
      scales = "free", space = "free") + 
    ylim(range(dat$B)) + 
    xlab("") 

# Build a seperate graphic for each Order and title 
plots <- 
    lapply(unique(dat$Order), function(o) { 
      g %+% dplyr::filter_(dat, ~ Order == o) + ggtitle(o) 
      }) 

# build as Grobs and plot via gridExtra::grid.arrange 
plots %>% 
    lapply(ggplotGrob) %>% 
    arrangeGrob(grobs = .) %>% 
    grid.arrange(., ncol = 1) 

enter image description here

0

Dưới đây là một giải pháp đơn giản: thêm một biến foo để dữ liệu của bạn bị sụp đổ các cấp độ của yếu tố bên trong như vậy interaction(foo, outer) có bộ cùng cấp như inner. Tôi biết tôi đang thiếu một số nhãn, vì vậy nếu ai đó có thể tìm ra một cách nhanh chóng để điền vào các nhãn tôi sẽ chỉnh sửa nó vào câu trả lời của tôi.

library(ggplot2) 
library(gridExtra) 
library(dplyr) 

dat <- 
    structure(list(Species = c("Acanthocyclops robustus", "Acroperus harpae", 
          "Alona affinis", "Ascaphus truei", "Bosmina longirostris"), 
       Intercept = c(-36.1182388331068, -27.2140776216155, -25.7920464721491, 
           -39.2233884219763, -31.4301301084581), 
       B = c(0.919397836908493, 0.716601987210452, 0.685455190113372, 
          1.04159758611351, 0.81077051300147), 
       Bconf = c(0.407917065756464, 
          0.181611850119198, 0.254101713856315, 0.708582768458448, 0.234313394549538 
         ), 
       Order = c("Cyclopoida", "Diplostraca", "Diplostraca", "Anura", 
          "Diplostraca"), 
       Family = c("Cyclopidae", "Chydoridae", "Chydoridae", 
          "Leiopelmatidae", "Bosminidae")), 
      .Names = c("Species", "Intercept", 
         "B", "Bconf", "Order", "Family"), row.names = c(NA, 5L), class = "data.frame") 

replace_with_int_rank = function (x) as.numeric(as.factor(x)) 
collapse_nested_factor = function(inner, outer){ 
    ave(as.character(inner), outer, FUN = replace_with_int_rank) 
} 
dat$Family_collapsed = collapse_nested_factor(inner = dat$Family, dat$Order) 
p <- ggplot(dat) + geom_point(aes(B,Species)) + facet_grid(Order~Family_collapsed, scales = "free") 

Nested ggplot faceting

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