Как объединить два базовых графика в R?

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

Используя ваш код, я сначала получаю сообщение об ошибке wt.image() о figure margins being too large

stefan_aus_hannover 23.03.2024 22:46

@stefan_aus_hannover Это потому, что ваше окно предварительного просмотра RStudio недостаточно велико.

jay.sf 24.03.2024 07:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать стандартные методы базы 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

jay.sf 24.03.2024 07:57
Ответ принят как подходящий

Очевидно, вы не можете размещать "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 24.03.2024 11:53

@temor Выведите список анализа, затем прокрутите список, чтобы построить график результатов. Смотрите обновление.

jay.sf 24.03.2024 12:13

Последний вопрос, пожалуйста, можно ли уменьшить белые области между панелями?

temor 25.03.2024 09:45

@temor Укажите, что вы подразумеваете под «белыми областями между панелями».

jay.sf 25.03.2024 09:57

области между индексом и спектром мощности вейвлета

temor 25.03.2024 09:59

пробелы в фактах

temor 25.03.2024 10:00

@temor Пространство между сюжетом и легендой?!

jay.sf 25.03.2024 10:50

да, и пространство между первой панелью и второй и между второй и третьей

temor 25.03.2024 11:24

@temor Пространство между сюжетом и легендой, очевидно, не реализовано, вы можете взломать функцию wt.image. Для последнего поиграйте с par, например. par(mar=c(2, 3, 3, 3) + .6.

jay.sf 25.03.2024 11:33

Другие вопросы по теме