使用ggplot2绘制成千上万行并融化

时间:2018-04-23 02:18:20

标签: r ggplot2 reshape2 melt

我想创建一个覆盖1000个MA(2)过程模拟的图(1个图,1000行)。我似乎无法让ggplot绘制这些1000系列中的一个以上。这里有很多关于这个问题的帖子,似乎大多数问题都是通过在reshape2库中使用融合函数来解决的,但是,这并没有解决我的问题。我不确定我的问题是什么,除了这里的其他数据集/示例似乎可以用于绘制多行,所以我想知道它是否是我的函数生成的数据。很抱歉,如果这是一个简单的修复,我似乎无法找到答案。

#create function to simulate MA(2) process
sim<-function(n,sigma,mu,theta) {
epsilon<-rnorm(n,0,sigma)
z<-matrix(nrow=n,ncol=1001)
z<-replicate(1000,
  z[,1]<-as.numeric(mu+epsilon[1:n]+theta*epsilon[2:n-1]) )
}

#run simulation, add time vector
z <-sim(23,0.5,0.61,0.95)
time<-matrix(seq(1,23))
z<-data.frame(time,z)

#collapse data
df <- data.frame(melt(zz,  id.vars = 'time', variable.name = 'series'))
df[["series"]] <- gsub("X", "series", df[["series"]])


#attempt to plot using ggplot2's 'group' and 'color'
ggplot(data=df, aes(x=time,y=value, group=series)) + 
 geom_line(aes(color = series)) +
 theme(legend.position='none')

1 个答案:

答案 0 :(得分:2)

我不清楚你想如何在一个图中显示1000行。这听起来像个坏主意。此外,您用来模拟MA(2)过程中的随机数据的代码不起作用;为什么不使用arima.sim,正是出于这个目的。

以下是使用MA(2)过程生成的数据绘制10个随机时间序列的示例。

set.seed(2017);
replicate(10, arima.sim(model = list(ma = c(-.7, .1)), n = 100)) %>%
    as_tibble() %>%
    mutate(time = 1:n()) %>%
    gather(key, val, -time) %>%
    ggplot(aes(time, val, group = key)) +
    geom_line(alpha = 0.4)

enter image description here