在 R 中向 ggplot2 Boxplot 添加误差线?

问题描述 投票:0回答:3
alphastats<-summarySE(map, measurevar="shannon", groupvars=c("age_class"))

 age_class      N  shannon        sd         se        ci
1   Non_Smoker 66 5.473424 0.4152997 0.05111986 0.1020934
2   Old_Smoker 47 5.271223 0.6046414 0.08819601 0.1775294
3 Young_Smoker 17 5.324977 0.8682071 0.21057116 0.4463909

嗨,所以我正在尝试将误差线添加到 R 中的 ggplot2 箱线图中。我使用三个组中每组的必要标准误差数据创建了上述数据框。

ggplot() + 
geom_boxplot(data=map, aes(x=age_class, y=shannon, fill=age_class), na.rm= TRUE ) + 
theme_bw() + 
geom_jitter(data=map, aes(x=age_class, y=shannon), position=position_jitter(width=0.1)) + 
labs(x="Group", y="Shannon Value") + 
guides(fill=guide_legend(title="Group Type")) + 
annotate("text", x=0.75, y=3.5, size=3, label=paste0("p-value =",alpha_p_round)) + 
geom_errorbar(data=alphastats, aes(ymin=shannon-se, ymax=shannon+se))

当我尝试通过 gg_errorbar() 添加误差线时,出现错误:

“eval(expr,envir,enclos)中的错误:找不到对象'x'

此外:警告消息:

1:在分钟(x,na.rm = na.rm)中:

min 没有非缺失参数;返回信息

2:在 max(x, na.rm = na.rm) 中:

max 没有非缺失参数;返回-Inf

3:在 min(diff(sort(x))) 中:min 没有非缺失参数;返回

信息

有人可以帮我找出我做错了什么吗?

r ggplot2
3个回答
0
投票

您的示例不可重现,但根据您提供的示例数据,以下内容有效:

alphastats <- read.table(
    text = " age_class      N  shannon        sd         se        ci
1   Non_Smoker 66 5.473424 0.4152997 0.05111986 0.1020934
2   Old_Smoker 47 5.271223 0.6046414 0.08819601 0.1775294
3 Young_Smoker 17 5.324977 0.8682071 0.21057116 0.4463909", header = T)

library(ggplot2);
ggplot(alphastats, aes(x = age_class, y = shannon)) +
    geom_point() + 
    theme_bw() +
    labs(x = "Group", y = "Shannon Value") +
    guides(fill=guide_legend(title = "Group Type")) +
    geom_errorbar(aes(ymin = shannon - se, ymax = shannon + se))

enter image description here


0
投票

您尚未在

x=age_class
中提供
geom_errorbar
,因此
geom_errorbar
不知道误差线的 x 坐标。如果将
x=age_class
添加到
geom_errorbar
,则代码将起作用。

您也可以稍微缩短您的代码。由于

geom_errorbar
使用与其他两个几何对象相同的
x
y
变量,因此另一种选择是执行
ggplot(map, aes(x=age_class, y=shannon)) + ...
。这意味着所有几何对象都将使用
map
数据框以及
age_class
shannon
列分别表示 x 和 y,除非另有说明。

然后,在

geom_errorbar
中,您只需向其提供新的数据框以及
ymin
ymax
美学。但是,您不需要提供
x
y
美学,除非您希望
geom_errorbar
使用与主
ggplot
调用中使用的列不同的列。

所以代码是:

ggplot(map, aes(x=age_class, y=shannon)) + 
  geom_boxplot(aes(fill=age_class)) + 
  geom_jitter(width=0.1) +   # geom_jitter takes a direct width argument. You can use the `position` argument, but it's not necessary.
  geom_errorbar(data=alphastats, aes(ymin=shannon-se, ymax=shannon+se)) +
  labs(x="Group", y="Shannon Value", fill="Group Type") +  # Note that the fill label has been moved to labs
  annotate("text", x=0.75, y=3.5, size=3, label=paste0("p-value =", alpha_p_round)) +
  theme_bw()

您确定要

geom_jitter
吗?如果您希望
shannon
的平均值与误差线一致,请使用
geom_point
。如果您希望它们都移动相同的量,请使用
position_nudge


0
投票

使用库可以很容易地根据原始数据绘制绘图

superb

假设原始数据位于名为

raw
的数据框中(见下文),则最小规范为

library(superb)
superb( shannon ~ age_class, raw,
  plotStyle = "boxplot"
) +
geom_jitter(data = raw, mapping=aes(x=age_class, y=shannon) ) 

结果完成了,但是有点难过,所以我们来改进一下:

library(superb)
superb( shannon ~ age_class, raw,
  plotStyle = "boxplot",
  errorbarParams = list(width = 0.25, color="black"), #keep the error bars black
  boxplotParams = list( alpha = 0.8 )  # have the box slightly transparent
) + aes(fill = factor(age_class)) +  # fill the box with colors based on age_class
geom_jitter(data = raw, alpha = 0.5, 
    mapping=aes(x=age_class, y=shannon), 
    width = 0.1 ) + # add the jittered dots layer
ylab("Shannon value") +
annotate("text", x=0.75, y=3.5, size=3, label="p-value = .05") +
theme_bw()

boxplot with jittered dots and error bars

就是这样。

为了拥有数据框,我使用了随机数生成器GRD:

library(superb)
raw <- GRD( 
    SubjectsPerGroup = c(66,47,17),
    RenameDV = "shannon",
    BSFactors= "age_class(Non_Smoker, Old_Smoker, Young_Smoker)",
    Population = list(mean=5.32, stddev = 0.1),
    Effects = list("age_class" = custom(+0.15,-0.5,0.0) )
)
© www.soinside.com 2019 - 2024. All rights reserved.