绘制多个列+ facet_grid(ggplot)

时间:2016-07-24 23:50:22

标签: r ggplot2

我的数据框如下:

    NUMBER  MEDIUM  DATE    DAY TREAT   NITRAT  SILI    PHOSPHAT
1   NUT1    15/07/2016  two NBNA    20.831  20.946  0.518
2   NUT2    15/07/2016  two NBNA    26.594  25.075  1.059
3   NUT3    15/07/2016  two NBNA    47.565  42.088  7.733
4   NUT4    15/07/2016  two NBNA    61.320  53.264  6.331
5   NUT5    15/07/2016  two NBNA    64.918  52.058  4.889
6   NUT1    15/07/2016  two NBNA    19.876  22.000  0.852
7   NUT2    15/07/2016  two NBNA    29.642  29.572  1.184
8   NUT3    15/07/2016  two NBNA    37.969  35.015  4.293
9   NUT4    15/07/2016  two NBNA    56.724  45.986  6.880
10  NUT5    15/07/2016  two NBNA    66.006  53.175  5.893
11  NUT1    15/07/2016  two NBNA    21.835  20.710  0.770
12  NUT2    15/07/2016  two NBNA    25.996  26.213  1.149
13  NUT3    15/07/2016  two NBNA    48.526  46.167  3.977
14  NUT4    15/07/2016  two NBNA    56.767  47.089  6.684
15  NUT5    15/07/2016  two NBNA    64.841  54.039  6.628
16  NUT1    15/07/2016  two NBA1    13.179  18.723  0.826
17  NUT2    15/07/2016  two NBA1    18.631  23.537  0.859

我想在一个ggplot中输入按MEDIUM排序的NITRAT,SILI和PHOSPHAT(带有误差条)的值。总之,这样的事情(但也有错误条):enter image description here 为此,我尝试了融化功能:

df <- melt(nut, id.vars='MEDIUM')

但是使用此函数后不允许我使用facet_grid

ggplot() +
  geom_bar(data=df, aes(x=MEDIUM, y=value, fill=MEDIUM),
           stat="identity", colour="black") + facet_grid(~TREAT)

1 个答案:

答案 0 :(得分:2)

你在这里要清理一些问题:

  1. 首先,只有你想要&#34;堆叠&#34;的列。 (即,用于fill审美)不应该在id.vars

    df <- melt(nut, id.vars=c('MEDIUM','NUMBER','DATE','DAY','TREAT')
    

    尝试使用id.vars的不同组合的上述代码,以获得它的工作原理。

  2. fill=variable现在将为三种测量类型(NITRAT,SILI和PHOSPHAT)中的每一种提供条形图。 TREAT仍然是融合数据框中的一列,因为它是id.vars之一,因此您可以将其用于分面。

  3. 另一个问题是,您实际上希望条形图是进入该条形图的所有值的平均值。所以你不想要stat="identity"。相反,使用stat_summary计算均值并将其绘制为条形。

  4. 要添加错误栏,请使用另一个stat_summary来电。我使用了自举置信区间(mean_cl_boot)。对于经典置信区间,请使用mean_cl_normal

    pd=position_dodge(0.8)
    
    ggplot(df, aes(x=MEDIUM, y=value, fill=variable)) +
      stat_summary(fun.y=mean, geom="bar", width=0.7, position=pd) + 
      stat_summary(fun.data=mean_cl_boot, geom="errorbar", position=pd, width=0.3) +
      facet_grid(. ~ TREAT) +
      theme_bw()
    
  5. enter image description here

    对于这样的情节,积分可能比酒吧更好。在这里,我们首先绘制误差线而不是秒,因为我们想要点&#34;在&#34;之上。酒吧。它在这里不重要,因为它们都是相同的颜色,但我是出于习惯而做的,因为我经常对错误条使用不同的颜色或透明度:

    pd=position_dodge(0.4)
    
    ggplot(df, aes(x=MEDIUM, y=value, colour=variable)) +
      stat_summary(fun.data=mean_cl_boot, geom="errorbar", position=pd, width=0.3) +
      stat_summary(fun.y=mean, geom="point", position=pd) + 
      facet_grid(. ~ TREAT) +
      theme_bw()
    

    enter image description here