2016-11-14 45 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

我一定会给你一个阅读!同上共享数据。再次感谢! –