2016-11-07 1 views
1

Ich versuche, die Daten (siehe unten) als ein gruppiertes Balkendiagramm zu plotten. Ich bin anderen Vorschlägen gefolgt, um position = "" in geom_bar zu ändern, aber ich kann nicht scheinen, es zu arbeiten. Alles, was ich je bekomme, ist ein gestapeltes Bar-Plot. Hier ist meine jüngste Versuch:ggplot2 barplot in R mit gruppierter Spalte, wie entstapeln?

ggplot(data = IFNg, aes(x = IFNg$Location, y = IFNg$`Fold Change`)) + 
    geom_bar(position = 'identity', stat = "identity", fill = IFNg$Day) + 
    ylab("Fold Change (log_2)") + geom_errorbar(limits, width=0.15) 

Ich habe auch versucht die folgenden, die auch in einer gestapelten Handlung führt, aber dieser ist anders gefärbt:

ggplot(data = IFNg, aes(x = IFNg$Location, y = IFNg$`Fold Change`, 
    fill= IFNg$Day)) + geom_bar(position = 'identity', stat = "identity") + 
    ylab("Fold Change (log_2)") + geom_errorbar(limits, width=0.15) 

enter image description here

Hier ist der Rest meines Codes mit Daten:

dat <- structure(list(Day = c(1L, 3L, 7L, 21L, 1L, 3L, 7L, 21L, 1L, 
3L, 7L, 21L), Order = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L), Target = c("IFN-g", "IFN-g", "IFN-g", "IFN-g", "IFN-g", 
"IFN-g", "IFN-g", "IFN-g", "IFN-g", "IFN-g", "IFN-g", "IFN-g"), 
Location = c("Duodenum", "Duodenum", "Duodenum", "Duodenum", 
"Duodenum (Lymph)", "Duodenum (Lymph)", "Duodenum (Lymph)", 
"Duodenum (Lymph)", "Proximal Jejunum", "Proximal Jejunum", 
"Proximal Jejunum", "Proximal Jejunum"), `Fold Change` = c(-1.750896098, 
-2.194886907, -0.838822724, 0.680612172, -0.375563984, 0.650154987, 
0.844897327, -0.228441603, -1.298230671, -1.173634963, -1.877736135, 
0.787322978), StDev = c(0.027477611, 0.029974897, 0.19025044, 1.235986647, 
0.055798435, 0.086102327, 0.115422155, 0.34470734, 0.020947691, 0.165294027, 
0.040111751, 0.035010207)), .Names = c("Day", "Order", "Target", "Location", 
"Fold Change", "StDev"), class = c("tbl_df", "data.frame"), row.names = c(NA,-12L)) 

IFNg <- dat[dat$Target == 'IFN-g', ] 

limits <- aes(ymax = IFNg$`Fold Change` + IFNg$StDev, 
    ymin = IFNg$`Fold Change` - IFNg$StDev) 
+1

Verwenden Sie niemals '$' in 'aes()'. Sie haben das Argument 'data', um' ggplot' den zu verwendenden Datenrahmen mitzuteilen. Das Übergeben von Vektoren 'x = data $ column' anstelle von Spaltennamen' x = column' zu 'aes' kann Probleme verursachen. In ähnlicher Weise (aber von der anderen Seite) müssen ** alle ** Abbildungen der Ästhetik zu Datenspalten innerhalb von 'aes()' liegen, einschließlich 'fill = Day'. – Gregor

+0

Danke @Gregor. Ich habe beide vorgeschlagenen Änderungen durchgeführt, aber die Handlung ist immer noch gestapelt. Nicht sicher, was los ist ... –

+0

Ihre Handlung ist nicht technisch gestapelt. Es hat nur alle Bars an einem einzigen Punkt, so dass Sie die "höheren" Bars hinter den "kürzeren" sehen können. Wie soll deine Grafik aussehen? Willst du ein ausgewichenes Balkendiagramm? Wenn ja, benutze 'position =" dodge "'. – aosmith

Antwort

4

Die meisten Ihrer Probleme sind von Sie tippen Dinge, die Sie nicht sollten, wie data$column anstelle von column. Außerdem ist Ihr Day numerisch, aber um verschiedene nebeneinander liegende Balken zu haben, die durch Day definiert sind, muss es diskret sein (ein Faktor).

Ich möchte auch darauf hinweisen, dass die ?geom_bar Hilfeseite nicht so lang und hat diesen Absatz:

standardmäßig an der gleichen Stelle auftreten mehrere xs wird übereinander durch position_stack gestapelt werden . Wenn Sie möchten, dass sie Seite an Seite ausgewichen sind, siehe ?position_dodge. Schließlich zeigt position_fill relative Proportionen bei jedem x durch Stapeln der Stäbe und dann Dehnen oder Quetschen auf die gleiche Höhe.

Normalerweise position = 'dodge' würde gut funktionieren, aber es wird verwirrt und denken, dass Ihre errorbar Breite die Breite ausweichen in diesem Fall ist, so dass wir die volle position = position_dodge() verwenden:

# No data$ inside aes()!!! 
limits <- aes(ymax = `Fold Change` + StDev, 
    ymin = `Fold Change` - StDev) 

ggplot(data = IFNg, 
    # group lets `ggplot` know we want different errorbars/bars for each day 
     aes(x = Location, y = `Fold Change`, group = factor(Day)) 
    ) + 
    geom_bar(
     stat = "identity", 
     aes(fill = factor(Day)), 
     position = position_dodge(width = 0.9) 
    ) + 
    ylab("Fold Change (log_2)") + 
    geom_errorbar(
     limits, 
     width = 0.15, 
     position = position_dodge(width = 0.9) 
    ) 

enter image description here

+0

danke für die Hilfe! Das hat perfekt funktioniert. –