组的条形图表示覆盖单个结果的行

时间:2014-12-08 20:48:26

标签: r plot ggplot2 visualization

这是我的第一个堆栈溢出帖子,我是一个相对较新的R用户,所以请轻轻一点!

我有一个包含三列的数据框,一个参与者标识符,一个条件(安慰剂或实验两个级别的因子)和一个结果分数。

set.seed(1)
dat <- data.frame(Condition = c(rep("Placebo",10),rep("Experimental",10)), 
                  Outcome = rnorm(20,15,2), 
                  ID = factor(rep(1:10,2)))

我想构建一个条形图,其中有两个条形图,每个条件的平均结果分数和标准差作为误差条。然后,我想在每个条件中覆盖每个参与者得分的连接线。因此,图表显示了个人响应以及组平均值。如果有可能我想包括轴断点。

我似乎无法在其他帖子中找到任何建议,如果我重复一个问题,请道歉。

非常感谢。

P.S。我意识到以这种方式呈现数据并不是每个人的口味。这是针对特定要求的!

3 个答案:

答案 0 :(得分:3)

这应该有效:

library(ggplot2)
library(dplyr)

dat.summ <- dat %>% group_by(Condition) %>%
  summarize(mean.outcome = mean(Outcome),
            sd.outcome = sd(Outcome))

ggplot(dat.summ, aes(x = Condition, y = mean.outcome)) +
  geom_bar(stat = "identity") +
  geom_errorbar(aes(ymin = mean.outcome - sd.outcome,
                    ymax = mean.outcome + sd.outcome),
                color = "dodgerblue", width = 0.3) +
  geom_point(data = dat, aes(x = Condition, y = Outcome),
            color = "firebrick", size = 1.2) +
  geom_line(data = dat, aes(x = Condition, y = Outcome, group = ID),
            color = "firebrick", size = 1.2, alpha = 0.5) +
  scale_y_continuous(limits = c(0, max(dat$Outcome)))

enter image description here

有些人使用ggplot的stat函数和参数比我更好,并且可能采用不同的方式。我更喜欢先转换我的数据。

答案 1 :(得分:3)

set.seed(1)
dat <- data.frame(Condition = c(rep("Placebo",10),rep("Experimental",10)), 
                  Outcome = rnorm(20,15,2), 
                  ID = factor(rep(1:10,2)))

dat.w <- reshape(dat, direction = 'wide', idvar = 'ID', timevar = 'Condition')

means <- colMeans(dat.w[, 2:3])
sds <- apply(dat.w[, 2:3], 2, sd)
ci.l <- means - sds
ci.u <- means + sds
ci.width <- .25

bp  <- barplot(means, ylim = c(0,20))
segments(bp, ci.l, bp, ci.u)
segments(bp - ci.width, ci.u, bp + ci.width, ci.u)
segments(bp - ci.width, ci.l, bp + ci.width, ci.l)
segments(x0 = bp[1], x1 = bp[2], y0 = dat.w[, 2], y1 = dat.w[, 3], col = 1:10)
points(c(rep(bp[1], 10), rep(bp[2], 10)), dat$Outcome, col = 1:10, pch = 19)

enter image description here

答案 2 :(得分:2)

以下是使用ggplot2

中的transfomations的方法
ggplot(dat) + 
stat_summary(aes(x=Condition, y=Outcome, group=Condition), fun.y="mean", geom="bar") + 
stat_summary(aes(x=Condition, y=Outcome, group=Condition), fun.data="mean_se", geom="errorbar", col="green", width=.8, size=2) + 
  geom_line(aes(x=Condition, y=Outcome, group=ID), col="red")

enter image description here