条形图使用ggplot2以置信区间对多列数据进行分组

时间:2017-08-08 18:21:39

标签: r plot ggplot2

我尝试创建分组多列数据的条形图,并为每个条形添加置信区间。到目前为止,我已经在不同的博客和平台(如stackoverflow)中的几个条目的帮助下完成了几乎所有任务。

我的数据sgr_sum_v3如下所示:

      treatment mean_C16_0 sd_C16_0 mean_C18_0 sd_C18_0 mean_LIN sd_LIN mean_ALA sd_ALA
      ALA    92500.0   1492.0    14406.7   1291.5    740.2   77.7   3399.2  436.4
      ALA+ARA    71538.3   3159.0    14088.7   1101.0    582.3   91.5   2089.3  439.6
      ALA+EPA    82324.6   2653.3    10745.2   1244.2    658.3   19.2   2629.3  134.7
      ALA+EPA+LIN+ARA    68422.9   2097.2    10818.2    721.8    969.9   24.0   2154.0  124.5
      ALA+LIN    87489.0   3150.6    15951.9    888.2   1173.0  279.1   2010.6  519.4
      ARA    65571.7   2635.6    11174.7   1851.9    589.0    7.0   1640.9  163.7
      control   107313.4  10828.0    22087.0   6217.7    783.8   38.6   2417.5   59.2
      EPA    76621.3   1863.7     9947.7    156.4    654.6   31.0   1946.8   56.6
      EPA+ARA    70312.3   2187.3    10896.8    148.6    716.8   24.4   2144.0  251.4
      EPA+LIN    79388.5   4866.9    10080.4    613.3   1449.9   41.7   1862.9  235.4
      LIN    87398.4   2213.9    11961.6    798.8   1909.3  100.2   1939.1   82.5
      LIN+ARA    71437.1   1220.1    12612.0   1190.8   1134.6  333.6   1628.6  508.1
      Scen   138102.2  22228.4    24893.0   1259.9   4259.4  612.0  23417.2 3946.5

基本上不同的治疗方法,平均值和某些测量值的标准偏差。

为了让情节运行,我基本上改编了这篇文章中的代码: Creating grouped bar-plot of multi-column data in R 来自joran的多栏问题和这篇文章的代码: Grouped barplot in R with error bars 来自Beauvel上校的置信区间。

这是我的代码:

library(reshape2)    
dfm <- data.frame()
dfm <- melt(sgr_sum_v3[,c('treatment', 'mean_ALA', 'mean_LIN')], id.vars = 1)

 ggplot(data=dfm, aes(x=treatment, y = value, fill = variable))+
   geom_bar(stat = "identity", position = "dodge")+
   geom_errorbar(aes(ymin = value - 1000, ymax = value + 1000), width = .2, position = position_dodge(.9))

现在我的问题是,由于融合函数解决了多列问题,我没有得到标准偏差来获得真正的错误栏(到目前为止,我只是插入1000以查看它是否有效)。

您是否有建议如何解决这个问题,或者甚至让多列图与原始数据一起运行(没有融化)这会使cf问题变得非常直接?

提前感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

不过,我的问题已经很老了,同时已经解决了,我将以更全面的方式回答它,正如@ dende85当前要求提供完整的代码一样。以下代码与上面的数据并不完全相同,但是我是为我的学生的一个小型R讲座创建的。但是,我很确定,这可能会更容易处理。 所以这是答案:

首先,我创建两个数据集。一个用于mean值,另一个用于sd。在这种情况下,我只选择了带有[1:4]内容

的子集
my_bar_data_mean <- data.frame(treatment = levels(my_data$treatment)[1:4])
my_bar_data_sd <- data.frame(treatment = levels(my_data$treatment)[1:4])

然后,我使用aggregate()为所有(在这种情况下为3)感兴趣参数的所有组计算meansd

#BL
my_bar_data_mean$BL_mean <- aggregate(my_data, 
                              by = list(my_data$treatment), 
                              FUN = mean, 
                              na.rm = TRUE)[, 8]
my_bar_data_sd$BL_sd <- aggregate(my_data, 
                            by = list(my_data$treatment), 
                            FUN = sd, 
                            na.rm = TRUE)[, 8]
# BW
my_bar_data_mean$BW_mean <- aggregate(my_data, 
                                 by = list(my_data$treatment), 
                                 FUN = mean, 
                                 na.rm = TRUE)[, 9]
my_bar_data_sd$BW_sd <- aggregate(my_data, 
                               by = list(my_data$treatment), 
                               FUN = sd, 
                               na.rm = TRUE)[, 9]
# SL
my_bar_data_mean$SL_mean <- aggregate(my_data, 
                                 by = list(my_data$treatment), 
                                 FUN = mean, 
                                 na.rm = TRUE)[, 10]
my_bar_data_sd$SL_sd <- aggregate(my_data, 
                               by = list(my_data$treatment), 
                               FUN = sd, 
                               na.rm = TRUE)[, 10]

现在,我们需要重塑data.frame。因此,我们需要一些软件包:

library(Hmisc)
library(car)
library(reshape2)

我们创建一个新的data.frame,并借助melt()函数来重塑我们的数据。请注意,我们还有两个data.frames:一个用于mean,另一个用于sd

dfm <- data.frame()
dfm <- melt(my_bar_data_mean)
temp <- data.frame()
temp <- melt(my_bar_data_sd)

现在我们可以看到,我们的变量是垂直收集的。我们只需要将value temp中的data.frame作为新列sd添加到第一个data.frame

dfm$sd <- temp$value

现在,我们只需要绘制所有内容:

ggplot(dfm, aes(variable, value, fill=treatment))+
  geom_bar(stat="identity", position = "dodge")+ 
  theme_classic() +
  geom_errorbar(aes(ymin = value - sd, ymax = value + sd), width=0.4, position = position_dodge(.9)) 

您可以简单地使用geom_errorbar并使用列valuesd添加最小和最大晶须的误差线。别忘了也为误差线设置position = position_dodge(.9)

您还可以通过简单地在第一行(variable中交换valueggplot(aes())来更改是否将响应变量绘制为躲避的条形并将其拆分以进行处理,反之亦然

我希望这个帮助。