2012-11-30 16 views
5

Jeśli mam czynnik zagnieżdżonych w tym przypadku mam wiele poziomów „rodzina”, które są zawarte we wskaźniku „porządek”, chciałbym potencjalnie stworzyćZagnieżdżony aspekt działka z ggplot2

facet_grid(Family/Order ~.) 

zamiast bieżącego

Zasadniczo - JEDEN pasek dla każdego zamówienia - który zawiera obok niego wszystkie paski dla każdej rodziny wewnątrz tego Zamówienia. Wiem, że facet_grid (Family/Order ~.) Nie jest obecnie możliwy, ale jak osiągnąć ten efekt? Czy można to zrobić za pomocą motywu()? Dziękuję bardzo. --SB

Powinienem podać powyżej, że zarówno Rodzina jak i Zamówienie są czynnikami. Wartości danych B są według gatunków, które mają poziom rodziny i poziom zamówienia, do którego należą. Oto kod dla mojej działki:

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

Oto przykładowe dane:

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

Należy pisać część kodu to jako przykład. Od sposobu, w jaki to opisujesz, ciężko jest zobaczyć, jak 'facet_grid (Order ~ Family)' nie da ci pożądanego rezultatu. – emhart

+0

Napisałem więcej szczegółów powyżej. Dzięki. – user1536207

+2

Podaj przykładowy zestaw danych. Nie można odpowiedzieć na to pytanie bez uzyskania pewnych informacji na temat struktury danych. –

Odpowiedz

0

Korzystanie facet_grid lub facet_wrap nie zbuduje grafikę, którą starają się budować. Można jednak zbudować listę grafiki, a następnie narysować je za pomocą gridEtrax::grid.arrange. Oto przykład

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

Oto proste rozwiązanie: dodaj zmienną foo do danych, które zapada poziomy wewnętrznej czynnik taki, że interaction(foo, outer) ma takie same zestawy poziomie jak inner. Wiem, że brakuje mi niektórych etykiet, więc jeśli ktoś może wymyślić szybki sposób na wypełnienie etykiet, zmienię go w moją odpowiedź.

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