我正在尝试创建分组的多列数据的条形图,并为每个条形图添加置信区间。到目前为止,我已经在不同博客和平台上的几个条目的帮助下完成了几乎所有的任务。
我的数据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一些测量值的平均值和标准差基本上是不同的处理。
为了让这个图运行起来,我基本上改编了这篇文章中的代码: joran中的Creating grouped bar-plot of multi-column data in R用于多列问题,以及这篇文章中的代码:博维尔上校的Grouped barplot in R with error bars中的置信区间。
下面是我的代码:
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))现在我的问题是,由于多列问题是由melt函数解决的,所以我没有获得真正的errorbars的标准差(到目前为止,我只是插入1000来看看它是否有效)。
你有没有建议如何解决这个问题,或者甚至让多列图与原始数据一起运行(不熔化),这将使cf问题变得非常简单?
提前感谢您的帮助:)
发布于 2020-10-27 18:42:55
尽管我的问题已经很老了,而且已经解决了,但我将以更全面的方式回答它,因为@dende85目前正在询问完整的代码。下面的代码与上面的数据并不完全一致,但我为我的学生创建了一个小型的R-lecture。然而,我非常确定,这可能会更容易处理。所以答案是:
首先,我创建了两个数据集。一个用于mean值,另一个用于sd。在本例中,我只选择了具有[1:4]-thing的子集
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个)感兴趣的参数计算所有组的mean和sd:
#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)我们在melt()-function的帮助下创建了一个新的data.frame并重塑了我们的数据。请注意,我们仍然有两个data.frames:一个用于mean,另一个用于sd
dfm <- data.frame()
dfm <- melt(my_bar_data_mean)
temp <- data.frame()
temp <- melt(my_bar_data_sd)现在我们可以看到,我们的变量是垂直收集的。我们只需将temp data.frame的value作为名为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添加错误条,并使用value和sd列表示最小和最大胡须。不要忘了为错误条设置position = position_dodge(.9)。
您还可以通过在第一行(ggplot(aes()))中交换variable和value来简单地更改是否将响应变量绘制为躲避条形图,并将它们拆分以进行处理,反之亦然。
我希望这篇文章能有所帮助。
https://stackoverflow.com/questions/45575462
复制相似问题