我正在绘制一个周期函数,但是使用浮点模数将所有周期覆盖到一个图上:
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?
原始数据如下所示:
我希望将所有时段叠加在一起,如下所示:
但是一个时期的结束与另一个时期的连接,与有问题的线条交错! 我怎样才能摆脱这些?
用ggplot绘制的相同数字没有显示问题,为什么会这样?
答案 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()