Как построить двухколонную сетку временных рядов с пользовательскими заголовками, используя R? - PullRequest
1 голос
/ 22 марта 2020

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

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="",)

, который дает следующий график:

enter image description here

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

1 Ответ

1 голос
/ 22 марта 2020

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

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])
})

enter image description here

Вы также можете передавать векторы аргументов (например, для ограничений по осям 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]])
})

enter image description here

Чтобы приблизить фигуру к виду по умолчанию 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)
})

enter image description here

...