my.date <- seq(as.POSIXct("2014-10-14 00:00:00", format="%F %T"), 
               by="hour", 
               length.out=6*128*24)  

library('WaveletComp')
x <- periodic.series(start.period=1*24, length=6*128*24)
my.data <- data.frame(date=my.date, x=x)

my.wt <- analyze.wavelet(my.data, "x",                   
                         loess.span=0, 
                         dt=1/24, dj=1/20, 
                         lowerPeriod=1/4, 
                         make.pval=TRUE, n.sim=10)


layaout2 <- layout(matrix(c(1, 2, 3), nrow=3))
wt.image(my.wt, main="wavelet power spectrum",
         legend.params=list(lab="wavelet power levels (quantiles)", 
                              lab.line=3.5, 
                              label.digits=2),
         periodlab="period (days)")
p1 <- recordPlot() 
wt.image(my.wt, main="wavelet power spectrum",
         legend.params=list(lab="wavelet power levels (quantiles)", 
                              lab.line=3.5, 
                              label.digits=2),
         periodlab="period (days)")
p2 <- recordPlot()
plot_grid(p1, p2,
          labels='AUTO',
          hjust=0, vjust=1)

我弄错了

Error in if (labels) { : missing value where TRUE / FALSE is required

推荐答案

显然你不能把"recordedplot"个物体放在layout上.

不知道你为什么要使用grDevices::recordPlot,也许你想模仿某种ggplot行为.然而,plot或使用它的WaveletComp::wt.image总是会完成绘图,所以你总是会看到你的绘图两次.

因此,你可以坚持使用layout或使用par(mfrow=),如@robert-hacken的答案,并根据他的建议设置graphics.reset=FALSE.

我建议使用png设备而不是RStudio预览窗口;它速度快得多,并产生硬编码图像大小.图存储在工作目录中(或使用png('/<path>/foo.R')).如果你不想使用它,只需注释掉pngdev.off行:

png('foo.png', 800, 600)  ## open png device

layout(matrix(c(1, 2), nrow=2))
par(mar=c(3, 3, 3, 3) + .6)  ## slightly reduce margins
wt.image(my.wt, main="wavelet power spectrum",
         legend.params=list(lab="wavelet power levels (quantiles)", 
                            lab.line=3.5, 
                            label.digits=2),
         periodlab="period (days)",
         graphics.reset=FALSE)
wt.image(my.wt, main="wavelet power spectrum",
         legend.params=list(lab="wavelet power levels (quantiles)", 
                            lab.line=3.5, 
                            label.digits=2),
         periodlab="period (days)",
         graphics.reset=FALSE)

dev.off()  ## close png device

enter image description here

Note:不要一起使用layoutpar(mfrow=, mfcol=)选项,因为它们不兼容.

更新

要将多个分析组合到一个绘图中,请首先将分析存储在list中,然后循环列表进行绘图.Example:

my.data3 <- my.data2 <- my.data1 <- my.data

my.wt_lst <- Map(
  analyze.wavelet,
  my.data=list(my.data1, my.data2, my.data3),
  my.serie='x',
  loess.span=c(0, .25, .5),
  dt=1/24,
  dj=1/20,
  lowerPeriod=1/4,
  make.pval=TRUE,
  n.sim=10
)

Map在元素上同步循环,也就是说,如果只有一个元素,比如dt=1/24,它总是使用1/24,如果有多个元素,比如my.data=list(my.data1, my.data2, my.data3),或者loess.span=c(0, .25, .5),它会一个接一个地使用元素.注意,list或data. frame本身是一个包含多个元素的列表,你需要再次列出它,例如my.data=list(my.data1)而不是my.data=my.data1.

png('foo.png', 1200, 600)
layout(matrix(seq_along(my.wt_lst), nrow=length(my.wt_lst)))
par(mar=c(3, 3, 3, 3) + .6)  ## slightly reduce margins
for (i in seq_along(my.wt_lst)) {
  wt.image(my.wt_lst[[i]], main="wavelet power spectrum",
           legend.params=list(lab="wavelet power levels (quantiles)", 
                              lab.line=3.5, 
                              label.digits=2),
           periodlab="period (days)",
           graphics.reset=FALSE)
}
dev.off()

enter image description here

R相关问答推荐

混淆矩阵,其中每列和等于1

在ggplot的注释表格中突出显示最大值

R等效于LABpascal(n,1)不同的列符号

带有叠加饼图系列的Highmap

如何在xyplot中 for each 面板打印R^2

如何利用模型函数在格图中添加双曲/指数曲线

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

根据日期从参考帧中创建不同的帧

如何在R forestplot中为多条垂直线分配唯一的 colored颜色 ?

基于R中的间隔扩展数据集行

Ggplot2中geom_tile的动态zoom

如何在PDF格式的kableExtra表格中显示管道字符?

在纵向数据集中创建新行

在使用具有Bray-Curtis相似性的pvCluust时计算p值

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

防止在更新SHINY中的Reactive Value的部分内容时触发依赖事件

使用ggplot2中的sec_axis()调整次轴

创建新列,其中S列的值取决于该行S值是否与其他行冗余

数据集上的R循环和存储模型系数

在同一单元格中创建包含整数和百分比的交叉表