2016-11-15 10 views
3

Hier ist ein Beispiel data.frame mit 30 eindeutigen Proben (ID 1 bis 30), und jede Probe hat drei Messungen (bei drei verschiedenen Schwellenwerten ('G1' Spalte); 5e-03, 5e -05, 5e-08). Jede der 90 Beobachtungen hat einen p-Wert (P-Spalte). Schließlich ist jeder der dreißig Proben kann auf eine von zehn verschiedenen Kategorien gehören (‚G2‘)facet barplot auf unebener Kategorie

# example data.frame 
df <- data.frame(
    'ID' = as.character(unlist(lapply(seq(1:30), function(x) rep(x,3)))), 
    'P' = runif(n = 90, min = 0, max = 1), 
    'G1' = as.character(c('5e-03','5e-05','5e-08')), 
    'G2' = as.character(unlist(lapply(sample(1:10, size = 30, replace = T), function(x) rep(x,3)))) 
) 

ich eine schöne Bar Grundstück mit diesem Befehl erzeugen kann [sorry für alle numerischen Variablen!];

ggplot(df, aes(x = interaction(ID,G2), y = P, fill = G2)) + 
    geom_bar(stat = 'identity') + 
    coord_flip() + 
    facet_grid(. ~ G1) 

, die wie folgt aussieht:

Plot 1: image with one facet, and 'G2' visualised using colour

Aber was ich wirklich tun möchte, ist zwei Facetten haben; "G1" auf den Spalten (wie es derzeit ist) und anstatt Bar Farbe zu verwenden, um die 'G2' Variable abzugrenzen, würde ich eine zweite horizontale Facette auf G2. Dies ist, was ich versucht habe:

ggplot(df, aes(x = interaction(ID,G2), y = P, fill = G2)) + 
    geom_bar(stat = 'identity') + 
    coord_flip() + 
    facet_grid(G2 ~ G1) 

und es ist nicht richtig. Wenn ich auf G2 Facette, ist es alle Proben in jeder Facette plotten. Dies ist hässlich, da jedes Sample nur zu einer G2-Kategorie gehören kann. Wie erzeuge ich die zweite Facette, in der nur die zu dieser Gruppe gehörenden Balken geplottet werden? Ich habe versucht, die Variablen 'drop', 'scale' und 'space' in facet_grid anzupassen, aber es verbessert die Dinge nicht.

This ist was ich suche - ich habe manuell Rechtecke über die Teile der Handlung gezeichnet, die in der Facette sein sollte. Es ist im Wesentlichen das Gleiche wie Diagramm 1, außer dass die Balken in eine G2-Facette aufgeteilt sind.

+0

Warum haben Sie coord_flip() hinzugefügt? entfernen Sie es und führen Sie den gleichen Code erneut aus. Ich denke das ist was du suchst –

+0

danke für die Antwort. Das Entfernen von coord_flip() löst das Problem nicht, die G2-Facette zeichnet noch unbeobachtete Daten auf. Ich benutze coord_flip(), weil ich die Grafik über die Seite aus ästhetischen Gründen möchte. – mbyvcm

+0

Vielleicht die Interaktion ändern, um einfügen? 'einfügen (ID, G2, sep =". ")' – zx8754

Antwort

2

Bitte beachten Sie, dass Sie die x=interaction(ID,G2) nicht mehr brauchen, da Sie mit G2 und G1 facettieren: x=ID ist genug.

Standardmäßig haben alle Facetten eines Diagramms dieselben Skalierungen für ihre X- und Y-Achsen. Aber man kann das mit dem Argument scales ändern

ggplot(df, aes(x = ID, y = P, fill = G2)) + 
    geom_bar(stat = 'identity') + 
    facet_grid(G1 ~ G2, scales="free_x") 

Bitte beachte, dass ich G1 und G2 in der Definition des Gitters getauscht. Ich glaube nicht, dass es möglich ist, es mit coord_flip() arbeiten zu lassen.

+0

Danke Pierre! Du hast es ziemlich gut gelöst, vielen Dank! Gibt es eine Möglichkeit, alle einzelnen Balken gleich breit zu halten? Ihre Lösung führt dazu, dass einige Balken sich ausdehnen, um die Facette zu füllen. – mbyvcm

1

Hinzufügen Sie einfach auf die Pierre Antwort:

ggplot(df, aes(x = ID, y = P, fill = G2)) + 
    geom_bar(stat = 'identity') + 
    facet_grid(G1 ~ G2, scales="free", space="free") 

Diese gleiche Breite für jede Bar geben.

+0

sehr schön Kumar!Es ist eine Schande, dass es keine Möglichkeit gibt, dies in Verbindung mit coord_flip() zu tun. Aber damit kann ich leben! – mbyvcm