2012-11-30 17 views
5

Wenn ich einen verschachtelten Faktor haben, in diesem Fall habe ich mehrere „Familie“ Ebenen haben, die in dem Faktor „Order“ enthalten sind, würde Ich mag, um möglicherweise einen stattNested Facette Grundstück mit ggplot2

facet_grid(Family/Order ~.) 

erstellen der aktuellen

Grundsätzlich - ein Streifen für jede Bestellung -, die neben alle Streifen für jede Familie innerhalb dieser Bestellung enthält. Ich weiß, dass facet_grid (Familie/Auftrag ~.) Momentan nicht möglich ist, aber wie würde ich diesen Effekt erreichen? Könnte es mit einem Theme() gemacht werden? Ich danke dir sehr. --SB

Ich sollte oben angegeben haben, dass sowohl Familie als auch Reihenfolge Faktoren sind. Die Datenwerte B sind nach Spezies geordnet, zu denen sie eine Familienstufe und eine Auftragsebene haben. Hier ist der Code für mein Grundstück:

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

Hier sind einige Beispieldaten:

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

Sie sollten einen Code mit dieser als Beispiel posten. Von der Art, wie Sie es beschreiben, ist es schwer zu sehen, wie 'facet_grid (Order ~ Family)' Ihnen nicht die gewünschte Ausgabe geben wird. – emhart

+0

Ich habe mehr Details oben gepostet. Vielen Dank. – user1536207

+2

Geben Sie einen Beispieldatensatz an. Es ist nicht möglich, Ihre Frage zu beantworten, ohne Angaben zur Struktur Ihrer Daten zu machen. –

Antwort

0

facet_grid oder facet_wrap Verwendung wird die Grafik nicht bauen Sie versuchen, zu bauen. Sie können jedoch eine Liste von Grafiken erstellen und diese dann über gridEtrax::grid.arrange plotten. Hier ist ein Beispiel

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

Hier ist eine einfache Lösung: eine variable foo auf Ihre Daten hinzufügen, die die Ebene des inneren Faktors kollabieren, so dass interaction(foo, outer) die gleichen Level-Sets wie inner hat. Ich weiß, dass mir ein paar Etiketten fehlen. Wenn also jemand einen schnellen Weg findet, die Etiketten auszufüllen, werde ich ihn in meine Antwort einfügen.

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

Verwandte Themen