R-Facet_Wrap每n列在一起可能吗?图表2

R-Facet_Wrap every n columns together possible ? ggplot2

我正在写一个基于 Cointegration 的 Shiny App。

找到协整向量后,我使用 ggplot2 绘制了所有均值回复序列。我这样做的方法是将所有这些协整系列放在一个数据框中,然后将其融化,然后根据变量进行分面包装。

直到这里我都没有问题。

现在我想将移动平均线和移动标准差添加到每个协整序列的图中,但我找不到单独使用 MA 和 STD 的每个序列的方法。

我知道我现在所拥有的问题是我的方式 facet_wraping 但我不是一个有经验的用户所以我不知道如何解决它。现在我有:

我希望 Cointegration Series 1、MA series1 和 Std Series 1 在同一张图上,颜色不同,而 Cointegration Series 2 相同.... 我使用的代码是:

 m= melt(DF, id.vars = "Date") # melt the df

ggplot(m, aes(x = Date, y = value, colour = variable, group=variable)) +geom_line() + facet_wrap( ~ variable) # plot

有没有办法将前 3 列放在一起?我应该以不同的方式融化吗?我需要解释更多才能更清楚吗?

编辑: 基本上用 Lehman 的术语来说,假设我有一个由列组成的数据框 df:

日期、S1、MA1、STD1、S2、MA2、STD2

我希望我的 x 轴是日期,并且我希望使用 ggplot2 在一个图上有 S1、MA1、STD1,在另一个图上有 S2、MA2 和 STD2。作为 id,我将 S1、MA1、STD1 包装在一起,然后将 S2、MA2、STD2 包装在一起

假设这是 DataFrame:

        Date           S1           M1          ST1         S2          M2        ST2
1 02/12/1999 -0.000217052  0.002862195 -0.002390842  2.2025825 -1.17258213 -0.3057015
2 03/12/1999 -0.004882038 -0.015920939 -0.007014382 -0.4040079 -0.69496488  0.1000167
3 06/12/1999 -0.001445954  0.005077610  0.000000000  1.1573779 -1.64268166 -0.3847015
4 07/12/1999 -0.000907952 -0.005403168  0.002027728 -0.3165827 -1.16466940 -1.0113501
5 08/12/1999  0.000881220  0.011375226 -0.013524439  0.5154455 -0.51725208  1.0942177
6 09/12/1999  0.001043752  0.013400502  0.017033342  1.9368608 -0.05587143  0.5203337

现在够清楚了吗?

I want my x axis to be Date, and I want to have S1, MA1, STD1 on a plot and S2, MA2 and STD2 on another plot using ggplot2.

如果按如下方式重塑数据:

         Date  S variable        value
1  02/12/1999 S1    value -0.000217052
2  03/12/1999 S1    value -0.004882038
3  06/12/1999 S1    value -0.001445954
4  07/12/1999 S1    value -0.000907952
5  08/12/1999 S1    value  0.000881220
6  09/12/1999 S1    value  0.001043752
7  02/12/1999 S2    value  2.202582500
8  03/12/1999 S2    value -0.404007900
9  06/12/1999 S2    value  1.157377900
10 07/12/1999 S2    value -0.316582700
11 08/12/1999 S2    value  0.515445500
12 09/12/1999 S2    value  1.936860800
13 02/12/1999 S1     mavg  0.002862195
14 03/12/1999 S1     mavg -0.015920939
15 06/12/1999 S1     mavg  0.005077610
16 07/12/1999 S1     mavg -0.005403168
17 08/12/1999 S1     mavg  0.011375226
18 09/12/1999 S1     mavg  0.013400502
19 02/12/1999 S2     mavg -1.172582130
20 03/12/1999 S2     mavg -0.694964880
21 06/12/1999 S2     mavg -1.642681660
22 07/12/1999 S2     mavg -1.164669400
23 08/12/1999 S2     mavg -0.517252080
24 09/12/1999 S2     mavg -0.055871430
25 02/12/1999 S1   stddev -0.002390842
26 03/12/1999 S1   stddev -0.007014382
27 06/12/1999 S1   stddev  0.000000000
28 07/12/1999 S1   stddev  0.002027728
29 08/12/1999 S1   stddev -0.013524439
30 09/12/1999 S1   stddev  0.017033342
31 02/12/1999 S2   stddev -0.305701500
32 03/12/1999 S2   stddev  0.100016700
33 06/12/1999 S2   stddev -0.384701500
34 07/12/1999 S2   stddev -1.011350100
35 08/12/1999 S2   stddev  1.094217700
36 09/12/1999 S2   stddev  0.520333700

然后就可以得到你想要的剧情如下:

ggplot(df, aes(x=Date)) + geom_line(aes(y=value, group=variable, colour=variable)) + facet_wrap(~ S)

这导致:

重塑数据:

有多种包可用于重塑数据,包括 tidyr、reshape2 等。我仍在学习如何使用这些包,但这是我重塑它的复杂方式。我相信有人可以更有效地做到这一点。 :)

# read the original data
df <- read.table("/tmp/table.dat")

# separate s1 and s2
df.s1 <- df[,1:4]
df.s2 <- df[,c(1,5:7)]

# convert s1 and s2 to long form
df.s1.melted <- melt(df.s1, id.vars=c("Date","M1","ST1"))
df.s2.melted <- melt(df.s2, id.vars=c("Date","M2","ST2"))

# rename columns of s1 and s2 so they can be combined with rbind
s1 <- setNames(df.s1.melted, c("Date", "mavg", "stddev", "S", "value"))
s2 <- setNames(df.s2.melted, c("Date", "mavg", "stddev", "S", "value"))

# combine s1 and s2 with rbind then convert mavg, stddev and value to long form
df <- melt(rbind(s1, s2), id.vars=c("Date", "S"))

# plot it
ggplot(df, aes(x=Date)) + geom_line(aes(y=value, group=variable, colour=variable)) + facet_wrap(~ S)