R和GG2中审美输入的转换

R和GG2中审美输入的转换,r,plot,ggplot2,R,Plot,Ggplot2,在geom的aes声明中,是否有方法转换ggplot2中的数据 我有一个与此概念相似的情节: test=data.frame("k"=rep(1:3,3),"ce"=rnorm(9),"comp"=as.factor(sort(rep(1:3,3)))) plot=ggplot(test,aes(y=ce,x=k))+geom_line(aes(lty=comp)) 假设我想为每个k点添加一条线,计算为三个comp之间的最大值,并且只有plot对象可用。我尝试了几种选择(例如,在aes声明中使

在geom的aes声明中,是否有方法转换ggplot2中的数据

我有一个与此概念相似的情节:

test=data.frame("k"=rep(1:3,3),"ce"=rnorm(9),"comp"=as.factor(sort(rep(1:3,3))))
plot=ggplot(test,aes(y=ce,x=k))+geom_line(aes(lty=comp))
假设我想为每个
k
点添加一条线,计算为三个
comp
之间的最大值,并且只有
plot
对象可用。我尝试了几种选择(例如,在aes声明中使用聚合、stat_函数等),但我找不到一种方法来实现这一点

目前,我正在通过使用
ggplot\u build
提取数据帧来解决这个问题,但我想找到一个直接的解决方案。

require(plyr)
max.line = ddply(test, .(k), summarise, ce = max(ce))
plot = ggplot(test, aes(y=ce,x=k))
plot = plot + geom_line(aes(lty=comp))
plot = plot + geom_line(data=max.line, color='red')
类似于您想要的东西?

编辑(对OP评论的回应):

好吧,我现在明白你的意思了——我应该更仔细地阅读你的问题。您可以使用
stat\u summary(…)
实现您想要的,它不需要访问原始数据帧。它还解决了我在下面描述的问题(!!)

将不起作用-您获得所有
test$ce
k
的最大值,这是没有用的

解决这个问题的一种方法(与@JLLagrange的答案基本相同,但不使用外部库)是:


这将使用max函数创建一个数据帧,通过k动态聚合ce。

感谢JLLagrange和jlhoward的帮助。但是,这两种解决方案都需要访问底层data.frame,而我没有。这是我正在使用的解决方法,基于前面的示例:

data=ggplot_build(plot)$data[[1]]
cemax=with(data,aggregate(y,by=list(x),max))
plot+geom_line(data=cemax,aes(x=Group.1,y=x),colour="green",alpha=.3,lwd=2)

这不需要直接访问数据集,但对我来说,这是一个非常低效且不雅观的解决方案。显然,如果没有其他方法来处理数据,我没有太多选择:)

谢谢!我已经更新了我的问题,让它更清楚。谢谢@jlhoward!我已经更新了我的问题,让它更清晰。这个解决方案是直接从OP的问题复制而来的。
plot + geom_line(aes(y=max(ce)))
plot+geom_line(data=aggregate(ce~k,test,max),colour="red")
data=ggplot_build(plot)$data[[1]]
cemax=with(data,aggregate(y,by=list(x),max))
plot+geom_line(data=cemax,aes(x=Group.1,y=x),colour="green",alpha=.3,lwd=2)