删除定期数据中的反向链接行

时间:2015-09-09 02:45:42

标签: r plot ggplot2

我正在绘制一个周期函数,但是使用浮点模数将所有周期覆盖到一个图上:

library(ggplot2)
x<-seq(1,100,by=0.2)                   #Generate high-res time series
y<-sin(x)                              #Generate y-values
y<-y+rnorm(length(y),mean=0,sd=0.1)    #Add noise
dat<-data.frame(x,y)                   #Package everything

ggplot(dat,aes(x=x,y=y))+geom_line()   #Data looks appropriate

dat$cyc<-dat$x%%(2*pi)                 #Reduce time to time-in-period

plot(dat$cyc, dat$y, type="l")         #This plot is... problematic

ggplot(dat,aes(x=cyc,y=y))+geom_line() #Why isn't this plot problematic?

原始数据如下所示:

A noisy sine wave

我希望将所有时段叠加在一起,如下所示:

Periods overlaid, but with bothersome lines connecting the beginning and end of periods

但是一个时期的结束与另一个时期的连接,与有问题的线条交错! 我怎样才能摆脱这些?

用ggplot绘制的相同数字没有显示问题,为什么会这样?

Periods overlaid using ggplot

1 个答案:

答案 0 :(得分:1)

plot添加额外行的原因是它按照您给出的顺序绘制点。解决此问题的两种方法是使用每个周期发生一次的循环来进行绘图,或者在每个周期之间将NA插入数据中。例如,您可以使用此plyr代码插入NA:

library(plyr)
dat$iteration <- floor(dat$x / (2 * pi))
dat <- plyr::ddply(dat, "iteration", function(d) rbind(d, NA))

或者这个dplyr代码:

library(dplyr)
dat <- dat %>%
    mutate(iteration = floor(x / (2 * pi))) %>%
    group_by(iteration) %>%
    do(rbind(., NA))

此时您可以使用plot(dat$cyc, dat$y, type="l")进行绘图。但是,你最好不要使用ggplot2。 (你有理由想使用基础绘图吗?)

你的ggplot2看起来更好的原因是它会按照x轴的顺序自动重新排列点。但 ggplot2仍有其自身的问题,,它正在绘制所有时段,好像它们是相同的数据 - 它不是将它们绘制为每个时期的单独曲线(注意它不是看起来与plot结果相同,即使除了水平线外。要做到这一点,您必须添加group美学:

dat$iteration <- floor(dat$x / (2 * pi))
ggplot(dat, aes(x = cyc, y = y, group = iteration)) + geom_line()