2016-11-07 96 views
1

我想繪製數據(見下面)作爲分組條形圖。我按照其他建議在這裏更改position = ""geom_bar,但我似乎無法使其工作。我所得到的只是一個堆積條形圖。這是我最近一次嘗試:ggplot2 barplot在R與分組列,如何unpack?

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) 

我也曾嘗試這也導致堆疊情節以下,但是這一次不同的着色:

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

這裏是休息我的代碼與數據:

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

切勿在'aes()'內使用''''。您有'data'參數來告訴'ggplot'數據框要使用。將向量'x = data $ column'而不是列名'x = column'傳遞給'aes'會導致問題。同樣,(但從另一方面來說),所有**美學映射到數據列需要在'aes()'內,包括'fill = Day'。 – Gregor

+0

謝謝@格雷戈。我已經完成了兩個建議的更改,但情節仍然是堆疊的。不知道發生了什麼事... –

+0

你的情節在技術上並不堆疊。它只是把所有酒吧放在一個點上,所以你可以看到「較短」酒吧背後的「高」酒吧。你想讓你的圖形看起來像什麼?你想要一個躲閃的酒吧情節?如果是這樣,請使用'position =「dodge」'。 – aosmith

回答

4

你的大部分問題是從你打字的東西你不應該像data$column而不是column。另外,您的Day是數字,但要使用Day定義的不同並排條,它需要是離散的(一個因子)。

我也想指出的是,?geom_bar幫助頁面是不是所有的長,有這樣一段話:

默認情況下,在同一個地方出現多次X的將被position_stack堆積在彼此頂上。如果你想讓他們左右避開,請參閱?position_dodge。最後,position_fill通過堆疊條然後拉伸或擠壓到相同的高度來顯示每個x處的相對比例。

通常情況下,position = 'dodge'會工作得很好,但會感到困惑,並認爲你errorbar寬度爲寬度躲閃在這種情況下,所以我們將使用全position = position_dodge()

# 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

感謝您的幫助!這工作完美。 –