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
@stefan_aus_hannover Это потому, что ваше окно предварительного просмотра RStudio недостаточно велико.





Вы можете использовать стандартные методы базы R, например. par(mfrow=c(2, 1)). Просто не забудьте установить graphics.reset=F для wt.image(), иначе при завершении будут сброшены исходные графические параметры, что, в частности, повторно применяет настройку mfrow, и следующий график будет помещен на новую страницу.
par(mfrow=c(2, 1))
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=F)
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=F)
Хорошее место graphics.reset=FALSE +1
Очевидно, вы не можете размещать "recordedplot" объекты на layout.
Не знаю, зачем вам вообще использовать grDevices::recordPlot, возможно, вы хотите имитировать какое-то поведение ggplot. Однако база plot или WaveletComp::wt.image, которая ее использует, всегда завершает построение графика, поэтому вы всегда будете видеть свои графики дважды.
Таким образом, вы можете придерживаться layout или использовать par(mfrow=), как в ответе @robert-hacken, и установить graphics.reset=FALSE согласно его совету.
Я рекомендую использовать устройство png, а не окно предварительного просмотра RStudio; это намного быстрее и создает жестко запрограммированный размер изображения. График хранится в рабочем каталоге (или используйте png('/<path>/foo.R')). Если вы не хотите его использовать, просто закомментируйте строки png и dev.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
Примечание. Не используйте layout вместе с опциями par(mfrow=, mfcol=), поскольку они несовместимы.
Чтобы объединить несколько анализов в графике, сначала сохраните анализы в list, а затем прокрутите список для построения графика. Пример:
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), он будет использовать элементы один за другим. Обратите внимание, что список или 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()
спасибо, могу ли я сохранить графики в списке? потому что я хочу просмотреть несколько случаев и сохранить график для каждого csae. наконец, я сохраняю все в foo.png на одной странице.
@temor Выведите список анализа, затем прокрутите список, чтобы построить график результатов. Смотрите обновление.
Последний вопрос, пожалуйста, можно ли уменьшить белые области между панелями?
@temor Укажите, что вы подразумеваете под «белыми областями между панелями».
области между индексом и спектром мощности вейвлета
пробелы в фактах
@temor Пространство между сюжетом и легендой?!
да, и пространство между первой панелью и второй и между второй и третьей
@temor Пространство между сюжетом и легендой, очевидно, не реализовано, вы можете взломать функцию wt.image. Для последнего поиграйте с par, например. par(mar=c(2, 3, 3, 3) + .6.
Используя ваш код, я сначала получаю сообщение об ошибке
wt.image()оfigure margins being too large