我有一个简单的数据框data
V1 V2 V3 V4 V5
1 3 3 3 5 6
2 3 4 6 10 12
3 5 6 8 10 11
4 4 5 7 9 11
5 2 3 5 8 9
此数据表示每轮比赛期间的表现。例如,在游戏4中,一个人在第三次迭代中得分为7。
我正在尝试创建一个这样的情节(情节来自here):
在x轴上将是圆形,在y轴上是平均性能,标准偏差为条形。第一轮的平均表现将是V1(3.4)的平均值,第二轮的平均表现为4.2。标准偏差也是根据V列计算的。
感谢BeasterField,我正在按以下方式转换数据:
df$n <- rownames(df)
df <- melt(df, id.vars="n", value.name="perf", variable.name="iter" )
dfc <- ddply(df, .(iter), summarise, se = sd( perf )/sqrt(length(perf)), perf = mean(perf))
给了我以下结果:
iter se perf
1 V1 0.5099020 3.4
2 V2 0.5830952 4.2
3 V3 0.8602325 5.8
4 V4 0.9273618 8.4
5 V5 1.0677078 9.8
但后来,当我尝试使用ggplot
时ggplot(dfc, aes(x=iter, y=perf))+geom_errorbar(aes(ymin=perf-se, ymax=perf+se), width=.1)+geom_line()+geom_point()
我收到:geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?
该图是在没有连接线的情况下构建的:
此外,我希望我的Y轴的最大值为20.
答案 0 :(得分:3)
您可以使用data.frame
reshape2::melt
从宽格式转换为长格式
library( reshape2 )
mdf$n <- rownames(mdf)
mdf <- melt( mdf, id.vars="n", value.name="perf", variable.name="iter" )
mdf
n iter perf
1 1 R1 4
2 2 R1 2
3 3 R1 1
4 1 R2 5
5 2 R2 3
6 3 R2 1
...
关于你的实际问题
我试图实现的是没有操纵数据帧,但没有任何运气。
您应该知道,ggplot
旨在以长格式处理data.frames。因此,首先融化然后绘制的程序是绝对常见的。有时在两者之间也存在拆分 - 应用 - 组合 - 步骤,正如您在summarySE
中指出的那样。在不知道这个功能的情况下,我猜它会像
library( plyr)
mdf <- ddply( mdf, .(n), summarise, se = sd( perf )/sqrt(length(perf)), perf = mean(perf))
mdf
n se perf
1 1 1.0198039 6.8
2 2 0.2000000 2.8
3 3 0.7483315 2.4
使用plot命令,你会看到你会得到