2013-04-04 46 views
3

我正在研究最后两点不是最新的一些地块。由此产生的低数字拉平我的平滑线。基于ggplot2子集的黄土平滑器

dat1<-data.frame(vals=c(30,40,50,30,40,50,30,10,5), 
       q.year=c("q1 09", "q2 09", "q3 09", "q4 09", "q1 10", "q2 10", "q3 10", "q4 10", "q1 11"), 
       dummy=rep("g1", 9) 
) 
dat1$q.year<-factor(dat1$q.year, unique(dat1$q.year)) 

ggplot(dat1, aes(x=q.year, y=vals, group=dummy))+ 
    geom_point()+ 
    geom_line()+ 
    geom_smooth(method="loess", se=FALSE, lty=2) 

我想绘制平滑没有两个低点。我可以用一个子集,这样做:

gg1<-ggplot(dat1, aes(x=q.year, y=vals, group=dummy))+ 
    geom_point()+ 
    geom_line()+ 
    geom_smooth(data=subset(dat1, q.year %in% levels(q.year)[1:7]), 
       method="loess", se=FALSE, lty=2) 
print(gg1) 

但是,当涉及到重新使用与新数据图(即GG2 < - GG1%+%someMoreData)我要补充另一条线路子集的新数据集(someMoreData)。

有没有更好的方法来做到这一点?我可以参考已经传入剧情的数据吗?

道歉,如果这个问题是不是很清楚 - 如果需要,

感谢

+0

我不相信有办法解决这并不仅仅归结为创建情节将更新没有'geom_smooth'图层,然后在决定是否需要对数据进行子集化之后添加它。 – joran 2013-04-04 15:31:37

回答

2
fun <- function(val,fac,n) {val[fac %in% tail(levels(fac),n)] <- NA; val} 

gg1a <- ggplot(dat1, aes(x=q.year, y=vals, group=dummy))+ 
    geom_point()+ 
    geom_line()+ 
    geom_smooth(aes(x=q.year,y=fun(vals,q.year,2)), 
       method="loess", se=FALSE, lty=2) 
print(gg1a) 
#Warning message: 
#Removed 2 rows containing missing values (stat_smooth). 

dat2<-data.frame(vals=c(50,40,50,30,40,50,30,10,5,5), 
       q.year=c("q1 09", "q2 09", "q3 09", "q4 09", "q1 10", "q2 10", "q3 10", "q4 10", "q1 11","q2 11"), 
       dummy=rep("g1", 10) 
) 
#make sure that your factor is ordered, 
#otherwise it gets reordered by ggplot according to levels 
dat2$q.year <- factor(as.character(dat2$q.year),levels=as.character(dat2$q.year),ordered = TRUE) 

gg1a %+% dat2 
#Warning message: 
#Removed 2 rows containing missing values (stat_smooth). 
+0

伟大的思想 - 非常感谢你 – 2013-04-04 17:32:48