Как построить двухколоночную сетку временных рядов с пользовательскими заголовками с помощью R?

У меня есть следующий код (хотя и без данных, к сожалению):

detrend_plot <- cbind(l_p_lng,l_vol_lng,l_p_oil,l_rgdpe, ldiff_p_lng,ldiff_vol_lng,ldiff_p_oil,ldiff_rgdpe)

plot.ts(detrend_plot, main="",)

что дает следующий сюжет:

введите здесь описание изображения

Что я хочу сделать, так это добавить пользовательские заголовки, отдельные метки оси Y и метки оси X. Я знаю, что это возможно с помощью GGPLOT, хотя мои знания об этом скудны. Кто-нибудь сталкивался с подобной проблемой? Я не думаю, что это возможно с помощью обычной функции plot.ts( ).


person Brennan    schedule 21.03.2020    source источник
comment
Вы можете поместить текст практически в любом месте с помощью mtext... просто разместить его будет проблематично. Вы, вероятно, не получите гораздо более конкретной помощи, если не поделитесь небольшим воспроизводимым примером, чтобы у людей было что-то для экспериментов, что, как они знают, имеет отношение к вашей проблеме.   -  person Gregor Thomas    schedule 22.03.2020
comment
И, если вы не против, если вы опубликуете данные, я думаю, кто-то тоже даст ggplot решение.   -  person Gregor Thomas    schedule 22.03.2020


Ответы (1)


Я не думаю, что вы можете напрямую передать несколько заголовков и меток в plot.ts, но вы можете просто перебрать свои столбцы с векторами меток для каждого:

set.seed(1)
z <- ts(matrix(rt(200 * 8, df = 3), 200, 8), start = c(1961, 1), frequency = 12)

## vectors of x, y, and main labels
xl <- sprintf('x label %s', 1:8)
yl <- sprintf('y label %s', 1:8)
ml <- sprintf('main label %s', 1:8)

par(mfrow = c(4, 2), mar = c(5, 5, 1, 1), oma = c(0, 0, 1, 2))
lapply(1:8, function(ii) {
  x <- z[, ii, drop = FALSE]
  plot(x, xlab = xl[ii], ylab = yl[ii], main = ml[ii])
})

введите здесь описание изображения

Вы также можете передавать векторы аргументов (например, для пределов оси X или Y), используя списки:

ylim <- list(c(-10, 10))
ylim <- rep(ylim, 8)

par(mfrow = c(4, 2), mar = c(5, 5, 1, 1), oma = c(0, 0, 1, 2))
lapply(1:8, function(ii) {
  x <- z[, ii, drop = FALSE]
  plot(x, xlab = xl[ii], ylab = yl[ii], main = ml[ii], col = ii, ylim = ylim[[ii]])
})

введите здесь описание изображения

Чтобы приблизить фигуру к виду plot.ts по умолчанию, вы можете просто установить верхнее и нижнее поля равными 0 и отрегулировать оси (что и делает plot.ts под капотом). Этот метод немного более подробный, чем plot.ts, но допускает больше настроек:

par(mfrow = c(4, 2), mar = c(0, 5, 0, 1), oma = c(5, 0, 3, 2))
lapply(1:8, function(ii) {
  x <- z[, ii, drop = FALSE]
  plot(x, xlab = xl[ii], ylab = yl[ii], col = ii, axes = FALSE)
  axis(2, las = 1)
  box()
  if (ii %in% 7:8) {
    axis(1)
    title(xlab = 'Year', xpd = NA)
  }
  if (ii %in% 1:2)
    title(main = c('Group 1', 'Group 2')[ii], xpd = NA, line = 1)
})

введите здесь описание изображения

person rawr    schedule 21.03.2020
comment
Это сработало бы, но исключает общую ось x в каждом из столбцов графиков. Я просто хочу бросить список ylabels, чтобы перезаписать тенденцию функций использовать имена переменных, не жертвуя структурой сюжета. - person Brennan; 22.03.2020
comment
@Brennan именно так работает plot.ts, и вы можете получить эту цифру, установив для верхнего и нижнего полей значение 0. Кроме того, вы можете просто изменить имена столбцов на то, что вы хотите, чтобы метки y были. ваш вопрос сейчас не имеет смысла, потому что вы сказали, что вам также нужны пользовательские заголовки и x labs, но, как это ни парадоксально, вам не нужно дополнительное пространство для них - person rawr; 22.03.2020