在dplyr中按分组后在ggplot2条形图中添加误差线

时间:2019-04-01 14:08:08

标签: r ggplot2 group-by dplyr

我在R中有以下数据。

oligo  condition  score
REF    Sample     27.827
REF    Sample     24.622
REF    Sample     31.042
REF    Competitor 21.066
REF    Competitor 18.413
REF    Competitor 36.164
ALT    Sample     75.465
ALT    Sample     57.058
ALT    Sample     66.408
ALT    Competitor 35.420
ALT    Competitor 17.652
ALT    Competitor 21.466

我已经想过了,并使用dplyr中的group_bysummarise函数获取每种条件的平均分数。

emsa_test <- emsa_1 %>% 
  group_by(oligo,condition) %>%
  summarise_all(mean)

创建此表。

oligo  condition  score
ALT    Competitor 24.84600
ALT    Sample     66.31033
REF    Competitor 25.21433
REF    Sample     27.83033

然后我使用ggplot2进行绘制。

ggplot(emsa_test, aes(oligo, score)) + 
geom_bar(aes(fill = condition), 
         width = 0.4, position = position_dodge(width=0.5), color = "black", stat="identity", size=.3) +  
theme_bw() +
ggtitle("CEBP\u03b1") +
theme(plot.title = element_text(size = 40, face = "bold", hjust = 0.5)) +
scale_fill_manual(values = c("#d8b365", "#f5f5f5"))

我的问题是我需要在绘图中添加误差线。实现将与此类似。

geom_errorbar(aes(ymin=len-se, ymax=len+se), width=.1, position=pd)

但是,在删除数据之后,表1中包含的最大和最小信息将丢失。我可以手动添加误差线,但是我要绘制一些图,所以想知道是否有办法通过管道保留此信息。

非常感谢。

3 个答案:

答案 0 :(得分:3)

您可以像这样通过dplyr来动态计算分量:

library(tidyverse)

df <- read_table(
"oligo  condition  score
REF    Sample     27.827
REF    Sample     24.622
REF    Sample     31.042
REF    Competitor 21.066
REF    Competitor 18.413
REF    Competitor 36.164
ALT    Sample     75.465
ALT    Sample     57.058
ALT    Sample     66.408
ALT    Competitor 35.420
ALT    Competitor 17.652
ALT    Competitor 21.466"
)

df %>%
  group_by(oligo, condition) %>%
  summarise(
    mean = mean(score),
    sd = sd(score),
    n = n(),
    se = sd / n
  ) %>%
  ggplot(aes(x = oligo, y = mean, fill = condition)) +
  geom_col(position = position_dodge()) +
  geom_errorbar(
    aes(ymin = mean - se, ymax = mean + se), 
    position = position_dodge2(padding = 0.5)
  ) +
  labs(
    title = "Mean Score ± 1 SE"
  )

reprex package(v0.2.1)于2019-04-01创建

答案 1 :(得分:1)

您可以汇总多个值并保留min maxmean

emsa_test <- emsa_1 %>% 
  group_by(oligo,condition) %>%
  summarise(mean=mean(score),min=min(score),max=max(score))

答案 2 :(得分:0)

没有足够的声誉发表评论,但刚刚注意到 JasonAizkalns 的回答中的一个错误,以防其他人简单地复制代码:se = sd/sqrt(n)