2016-11-14 70 views
1

我有一個數據集,看起來像這樣:GGPLOT2多個連續可變繪圖

Distance Mean SD Median VI Vegetation.Index  Direction X X.1 X.2 X.3 
1  10m 0.525 0.082 0.530 NDVI    NDVI Whole Landscape NA NA NA NA 
2  25m 0.517 0.085 0.523 NDVI    NDVI Whole Landscape NA NA NA NA 
3  50m 0.509 0.086 0.514 NDVI    NDVI Whole Landscape NA NA NA NA 
4  100m 0.494 0.090 0.497 NDVI    NDVI Whole Landscape NA NA NA NA 
5  10m 0.545 0.076 0.551 NDVIe    NDVI   East NA NA NA NA 
6  25m 0.542 0.078 0.549 NDVIe    NDVI   East NA NA NA NA 


> dput(droplevels(head(data))) 
structure(list(Distance = structure(c(2L, 3L, 4L, 1L, 2L, 3L), .Label = c("100m", 
"10m", "25m", "50m"), class = "factor"), Mean = c(0.525, 0.517, 
0.509, 0.494, 0.545, 0.542), SD = c(0.082, 0.085, 0.086, 0.09, 
0.076, 0.078), Median = c(0.53, 0.523, 0.514, 0.497, 0.551, 0.549 
), VI = structure(c(1L, 1L, 1L, 1L, 2L, 2L), .Label = c("NDVI", 
"NDVIe"), class = "factor"), Vegetation.Index = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = "NDVI", class = "factor"), Direction = structure(c(2L, 
2L, 2L, 2L, 1L, 1L), .Label = c("East", "Whole Landscape"), class = "factor"), 
X = c(NA, NA, NA, NA, NA, NA), X.1 = c(NA, NA, NA, NA, NA, 
NA), X.2 = c(NA, NA, NA, NA, NA, NA), X.3 = c(NA, NA, NA, 
NA, NA, NA)), .Names = c("Distance", "Mean", "SD", "Median", 
"VI", "Vegetation.Index", "Direction", "X", "X.1", "X.2", "X.3" 
), row.names = c(NA, 6L), class = "data.frame") 

我想創建一個barplot面網格上的x軸的分類變量(距離),連續可變y軸(植被指數)和兩個巴條(平均和中值的營養指數值)。該欄通過「方向」和「植被指數」繪製曲線。

我已經完成了一種類型的度量(均值),如下圖所示。

enter image description here

這裏是我現在的代碼:

p = ggplot(data,aes(x=Distance,y=Mean,fill=Distance)) + geom_bar(stat = 
    'identity',position='dodge')+ facet_grid(Direction~Vegetation.Index)+ 
    coord_cartesian(ylim=c(0.2,0.95)) + geom_errorbar(data = data, 
    aes(ymin=Mean-SD,ymax=Mean+SD),width=0.5) 

但我也想爲它旁邊正中一間酒吧。

Like this但對於所有的方塊網格條形圖。

我發現人們想要做這個確切的或類似的事情某些線程,並發現它們是相當有用的:

This

Or this

然而,我的數據看起來與他們的很不一樣(我認爲)並以任何方式改變它已經弄亂了我已有的東西。根據我的理解,我必須使用group ='Mean + Median'。

+2

請一個[重複的例子(點擊鏈接,許多技巧)(http://stackoverflow.com/q/5963269/903061)。不要共享數據的圖像。取而代之的是(a)使用看起來像數據的內置數據,(b)共享短代碼來模擬樣本數據,或者(c)使用'dput()'重複共享您的數據(或者可能是數據的一部分) 。 – Gregor

+0

此外,請更清楚您的期望輸出。 「沿着x軸的多個連續變量」沒有多大意義,尤其是對於一個barplot。條形圖的x軸是分類的,而不是連續的。你的意思是你想要沿着X軸的*類型的度量*,例如一箇中間的酒吧,一個酒吧的平均值? – Gregor

+0

經過您的澄清,看起來您的第一個問題鏈接幾乎是完全重複的。您需要將您的數據**轉換爲長格式**,其中您只有一個「* measure *」列,可以使用「mean」或「median」和單個「* value *」列採用平均值或中值的數值。你可以使用'melt' [就像這個答案](http://stackoverflow.com/a/30023982/903061)那樣做。 – Gregor

回答

2

使用您的示例數據,我們首先將其轉換爲長格式。這裏我使用tidyr::gather,但reshape2::melt(或data.table::melt)的工作方式類似。

library(tidyr) 
dfl = gather(df, key = measure, value = value, Mean, Median) 

dodge_width = 0.8 
ggplot(dfl, 
     aes(x = measure, y = value, fill = Distance, group = Distance)) + 
    geom_bar(stat = 'identity', 
      position = position_dodge(dodge_width), 
      width = dodge_width) + 
    facet_grid(Direction ~ Vegetation.Index) + 
    coord_cartesian(ylim = c(0.2, 0.95)) + 
    geom_errorbar(
     aes(ymin = value - SD, ymax = value + SD), 
     width=0.5, 
     position = position_dodge(dodge_width) 
    ) 

enter image description here

+0

令人驚歎。你一直非常有幫助。非常感謝!這也準確地指出了我的嘗試出錯的地方。我對R很新,所以目前語法有點笨拙。再次感謝!! –

+1

很高興你發現它有幫助!如果你打算多使用'ggplot',我強烈推薦閱讀[Tidy Data論文](http://vita.had.co.nz/papers/tidy-data.pdf) - 95%的新用戶掙扎'ggplot'正在以正確的格式獲取數據,而整齊的數據文件有助於描述目標。下一次你提出一個關於SO的問題,你就會知道從一開始就可以重複地共享數據:) – Gregor

+0

我一定會給你一個閱讀!同上共享數據。再次感謝! –