【问题标题】:Using the "aggregate" function for drawing line plots使用“聚合”功能绘制线图
【发布时间】:2019-01-06 00:04:27
【问题描述】:

我正在尝试为两组数据(治疗与控制)绘制带有误差线的线图。总共有 20 个时段,10 个试用时段 (TP) 和 10 个正式时段 (P),我想展示组的含义如何随时间变化。为简单起见,以下数据帧包括 3 个试用期(TP1、TP5、TP10)和 3 个正式期(P1、P5、P10)。

下面是我的代码。我的问题是“聚合”函数通过将它们作为字符串来改变周期的顺序,这会扰乱时间趋势——我希望它们的排序为 TP1->TP5->TP10->P1->P5-> P10

我想这不是太棘手,但我只是卡住了。如果有人能告诉我如何解决这个问题,我将不胜感激。

另外:由于总共有 20 个周期,因此绘制误差带(或 CI 带)而不是大量误差条可能看起来更好。有没有办法做到这一点?

df <- data.frame(Condition=c(rep("Treatment", 10), rep("Control", 10)), 
               TP1=rnorm(20, 1, 1), TP5=rnorm(20, 5, 1), TP10=rnorm(20, 10, 1), 
               P1=rnorm(20, 1, 1), P5=rnorm(20, 5, 1), P10=rnorm(20, 10, 1))

temp <- tidyr::gather(df, Period, x, -Condition)

m <- aggregate(x~Period + Condition, temp, mean)

st.err <- function(x) sqrt(var(x)/length(x))

se <- aggregate(x~Period + Condition, temp, st.err)

ci.data <- cbind(m, se[, 3])

colnames(ci.data) <-  c("Period", "Condition", "Mean", "SE")

library(ggplot2)
ggplot(data=ci.data, aes(x=Period, y=Mean, group=Condition, color=Condition)) + 
  geom_line() + 
  geom_point() +  
  geom_errorbar(aes(ymin=Mean-SE, ymax=Mean + SE), 
                width=.1, position=position_dodge(0.05)) 

【问题讨论】:

标签: r aggregate line-plot


【解决方案1】:

使用reshape2::melt() 将句点转换为更好排序的因子。这里不需要更多的聚合,因为geom_smooth() 正在做你想做的事。

df.long <- reshape2::melt(df, "Condition", variable.name="Period", value.name = "x")

library(ggplot2)
ggplot(df.long, aes(x=Period, y=x, group=Condition, color=Condition, fill=Condition)) + 
  geom_smooth(method="loess", level=0.95, alpha=.2) 

收益

数据

set.seed(42)  # for sake of reproducibility
df <- data.frame(Condition=c(rep("Treatment", 10), rep("Control", 10)), 
               TP1=rnorm(20, 1, 1), TP5=rnorm(20, 5, 1), TP10=rnorm(20, 10, 1), 
               P1=rnorm(20, 1, 1), P5=rnorm(20, 5, 1), P10=rnorm(20, 10, 1))

编辑

对于较大的数据集,您可以使用span 调整平滑。导出情节,例如将png() 发送到您的working directory

png("test.png", width=1080, height=720, res=100)
ggplot(df.long, aes(x=Period, y=x, group=Condition, color=Condition, fill=Condition)) + 
  geom_smooth(method="loess", level=0.95, alpha=.2, span=.2) +
  labs(title="My Plot")
dev.off()

收益

【讨论】:

  • 谢谢,太棒了!不过,在将代码应用到更大的数据集时,我遇到了一些问题。有两个主要问题,首先实际上有 28 个周期,并且情节的宽度太窄而无法很好地适应它们,而第二个问题似乎加剧了这种情况。第二个问题是:治疗组的平均值有时会发生巨大变化(暴跌等),但输出图平滑了这些变化并掩盖了我想要显示的急剧变化。这是更大数据集dropbox.com/s/ruxxujd4byt4ste/df.csv?dl=0 的链接。非常感谢您的帮助!!!
  • 查看我的编辑。您可能正在谈论 RStudio 中的预览窗口(您可以使用鼠标缩放)。我确定您要导出情节,例如?png?pdf?ggsave。这对你有用吗?
  • 太棒了!现在,在 Stack Overflow 上,通常会将答案标记为已接受并获得 +2 声誉。单击答案旁边的复选标记将其从空心切换为绿色(请参阅help)。
  • 我刚刚做到了。谢谢你教我这个!非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多