2016-03-28 4 views
0

Ich habe Probleme, das richtige Facettierungsverhalten zu erhalten, wenn zwei geoms auf einem einzelnen Diagramm überlagert werden.ggplot2 facettieren mit mehreren Ebenen

Meine Eingabedaten bestehen aus zwei Datenrahmen. df enthält Taxon-Häufigkeitsdaten, die nach variable gruppiert und von short_taxa gestapelt und dann durch SampleType facettiert werden.

df <- structure(list(variable = c("Subject1", "Subject1", "Subject2", 
"Subject2", "Subject5", "Subject5", "Subject7", "Subject7", "Subject8", 
"Subject8", "Subject11", "Subject11", "Subject12", "Subject12", 
"Subject14", "Subject14", "Subject15", "Subject15", "Subject18", 
"Subject18", "Subject20", "Subject20", "Subject22", "Subject22", 
"Subject24", "Subject24", "Subject25", "Subject25", "Subject28", 
"Subject28", "Subject30", "Subject30", "Subject31", "Subject31", 
"Subject32", "Subject32"), value = c(32.4137931034483, 0, 13.6363636363636, 
19.435736677116, 16.3304514889529, 27.4735830931796, 38.4180790960452, 
0.564971751412429, 33.9024390243902, 1.46341463414634, 37.2093023255814, 
5.42635658914729, 23.3175355450237, 32.7962085308057, 35.8024691358025, 
0, 14.1210374639769, 48.4149855907781, 1.86516853932584, 1.50561797752809, 
43.9490445859873, 0.955414012738854, 3.76932989690722, 88.8208762886598, 
29.6511627906977, 4.36046511627907, 32.4742268041237, 19.5876288659794, 
2.03570310053241, 91.1055433761353, 40.9356725146199, 0, 31.2335958005249, 
6.2992125984252, 35.1084812623274, 7.88954635108481), short_taxa = c("f__Retroviridae", 
"f__Siphoviridae", "f__Retroviridae", "f__Siphoviridae", "f__Retroviridae", 
"f__Siphoviridae", "f__Retroviridae", "f__Siphoviridae", "f__Retroviridae", 
"f__Siphoviridae", "f__Retroviridae", "f__Siphoviridae", "f__Retroviridae", 
"f__Siphoviridae", "f__Retroviridae", "f__Siphoviridae", "f__Retroviridae", 
"f__Siphoviridae", "f__Retroviridae", "f__Siphoviridae", "f__Retroviridae", 
"f__Siphoviridae", "f__Retroviridae", "f__Siphoviridae", "f__Retroviridae", 
"f__Siphoviridae", "f__Retroviridae", "f__Siphoviridae", "f__Retroviridae", 
"f__Siphoviridae", "f__Retroviridae", "f__Siphoviridae", "f__Retroviridae", 
"f__Siphoviridae", "f__Retroviridae", "f__Siphoviridae"), SampleType = c("Group2", 
"Group2", "Group3", "Group3", "Group1", "Group1", "Group2", "Group2", 
"Group3", "Group3", "Group2", "Group2", "Group1", "Group1", "Group2", 
"Group2", "Group3", "Group3", "Group1", "Group1", "Group2", "Group2", 
"Group3", "Group3", "Group3", "Group3", "Group1", "Group1", "Group1", 
"Group1", "Group2", "Group2", "Group3", "Group3", "Group1", "Group1" 
)), .Names = c("variable", "value", "short_taxa", "SampleType" 
), row.names = c(17L, 21L, 43L, 47L, 121L, 125L, 173L, 177L, 
199L, 203L, 277L, 281L, 303L, 307L, 355L, 359L, 381L, 385L, 459L, 
463L, 511L, 515L, 563L, 567L, 615L, 619L, 641L, 645L, 719L, 723L, 
771L, 775L, 797L, 801L, 823L, 827L), class = "data.frame") 

ich bekommen kann dies wie so schön zu zeichnen:

ggplot(df, aes(x=variable, y=value, fill=short_taxa, group=short_taxa)) 
    + geom_bar(stat="identity", position="stack") + ylim(c(-10, 100)) 
    + facet_wrap(~SampleType, scales="free") + theme_classic() + 
    theme(legend.position = "right", legend.key.size = unit(1, "lines"), 
    axis.text.x = element_text(angle=90, vjust=0.5), plot.margin = 
    unit(c(2, 1, 0.5, 0.5), "lines")) 

enter image description here

Nun, was ich möchte ist zu tun, um eine geom_rect unter jedem gestapelten BarPlot hinzufügen (entsprechend jeweils Subject), die eine Dichtemessung für dieses Subjekt darstellt.

df.coloring <- structure(list(variable = c("Subject24", "Subject25", "Subject7", 
"Subject28", "Subject29", "Subject13", "Subject9", "Subject32", 
"Subject33", "Subject11", "Subject20", "Subject14", "Subject21", 
"Subject5", "Subject1", "Subject17", "Subject18", "Subject3"), 
    xmin = c(0.5, 1.5, 4.5, 6.5, 7.5, 10.5, 11.5, 13.5, 14.5, 
    17.5, 19.5, 21.5, 23.5, 24.5, 27.5, 29.5, 30.5, 31.5), xmax = c(1.5, 
    2.5, 5.5, 7.5, 8.5, 11.5, 12.5, 14.5, 15.5, 18.5, 20.5, 22.5, 
    24.5, 25.5, 28.5, 30.5, 31.5, 32.5), ymin = c(-6, -6, -6, 
    -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6 
    ), ymax = c(-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 
    -4, -4, -4, -4, -4, -4), SampleType = c("Group2", "Group3", 
    "Group1", "Group2", "Group3", "Group2", "Group1", "Group2", 
    "Group3", "Group1", "Group2", "Group3", "Group3", "Group1", 
    "Group1", "Group2", "Group3", "Group1"), density = c(0.640242130728438, 
    0.116821877425537, 0.0310043091885746, 0.0189890721812844, 
    0.974712340626866, 0.421599371824414, 0.169613848207518, 
    0.76187791978009, 0.69058098597452, 0.600862825522199, 0.671995443990454, 
    0.225653737317771, 0.911656582495198, 0.342635749839246, 
    0.138989825500175, 0.987418259494007, 0.739982327679172, 
    0.241753033129498)), .Names = c("variable", "xmin", "xmax", 
"ymin", "ymax", "SampleType", "density"), row.names = c(1L, 2L, 
5L, 7L, 8L, 11L, 12L, 14L, 15L, 18L, 20L, 22L, 24L, 25L, 28L, 
30L, 31L, 32L), class = "data.frame") 

Ich habe verschiedene Iterationen versucht:

ggplot(df, aes(x=variable, y=value, fill=short_taxa, order=short_taxa)) 
    + geom_bar(stat="identity", position="stack") + ylim(c(-10, 100)) 
    + geom_rect(data=df.coloring, aes(xmin=xmin, xmax=xmax, ymin=ymin, 
    ymax=ymax, color=density), fill=NA, inherit.aes=F) 
    + scale_color_distiller() + facet_wrap(~SampleType, scales="free") 
    + theme_classic() + theme(legend.position = "right", 
    legend.key.size = unit(1, "lines"), axis.text.x = 
    element_text(angle=90, vjust=0.5), plot.margin = 
    unit(c(2, 1, 0.5, 0.5), "lines")) 

Aber was am Ende passiert ist, dass jeder SampleType Plots alle 18 der Probanden, statt nur die 6, die zur Facette gehören. enter image description here

Was mache ich falsch? Vielen Dank!

Antwort

3

Ich denke, das ist eine Situation, in der besser funktioniert als geom_rect.

Von der Hilfeseite:

geom_rect nutzt die Positionen der vier Ecken (xmin, xmax, ymin und ymax ).

geom_tile verwendet die Mitte der Fliese und ihre Größe (x, y, Breite, Höhe).

Durch Zentrieren der Fliese auf variable, sollte Ihre Facettierung besser arbeiten, weil die x-Achse von geom_bar und geom_tile wird auf der gleiche Variable basieren. Um zu verwenden, müssen Sie y, width und height definieren. Sie können sie in df.coloring setzen statt ymin, ymax usw.

df.coloring$y = -5 
df.coloring$height = 2 
df.coloring$width = 1 

Auf einer Seite beachten, Ihre variable Werte in df.coloring erscheinen nicht korrekt mit SampleType angepasst werden (im Vergleich zu dem, was in df). Dies macht die Dinge komplizierter.Um die Dinge in der richtigen Reihenfolge für den Beispiel-Code ich getan habe:

df.coloring$variable = unique(df$variable) 

Jetzt geom_tile anstelle von geom_rect verwenden, um das Grundstück zu erhalten Sie wollen:

ggplot(df, aes(x=variable, y=value, fill=short_taxa, order=short_taxa)) + 
    geom_bar(stat="identity", position="stack") + 
    ylim(c(-10, 100)) + 
    geom_tile(data = df.coloring, aes(x = variable, y = y, width = width, 
            height = height, color = density), 
       fill = NA, inherit.aes = FALSE) + 
    scale_color_distiller() + 
    facet_wrap(~SampleType, scales="free_x") + 
    theme_classic() + 
    theme(legend.position = "right", 
      legend.key.size = unit(1, "lines"), 
      axis.text.x = element_text(angle=90, vjust=0.5), 
      plot.margin = unit(c(2, 1, 0.5, 0.5), "lines")) 

enter image description here

Weil Sie wollen Da alle Ihre Kacheln die gleiche Größe haben, können Sie feste Werte für y, width usw. angeben, anstatt diese zum Datensatz hinzuzufügen.

geom_tile(data=df.coloring, aes(x = variable, y = -5, width = 1, 
             height = 2, color=density), 
        fill = NA, inherit.aes = FALSE) 
+0

danke - das hat den Trick gemacht und ich habe auch etwas Neues gelernt! – fanli