Как закрасить фон на каждой панели xyplot в соответствии с факторной переменной? - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь построить xyplot, который содержит другой цвет фона в соответствии с различными значениями дополнительной категориальной переменной. Нет проблем получить повторяющуюся окраску фона с помощью функции panel.xblocks (package: latticeExtra), но до сих пор я не нашел способа реализовать это с разной окраской для разных подзаговоров в xyplot.

JD <- c(seq(0,19, 1), seq(0,19, 1))
VAR <- c(rnorm(20, mean=10, sd=1), rnorm(20, mean=10, sd=1))
CATEG <- c(rep("A", 5), rep("B", 15), rep("A", 10), rep("B", 10))
YEAR <- c(rep(2001, 20), rep(2002, 20))

myd <- data.frame(JD, VAR, CATEG, YEAR)

xyplot((VAR) ~ JD | factor(YEAR), type="l",
       xlab="", ylab="", col=1, data=myd)+ 
  layer_(panel.xblocks(x, CATEG,
                       col = c("lightgray")))

При выполнении вышеприведенного кода фоновая раскраска из первого субплота xyplot (2001 год) повторяется во втором субплоте xyplot (2002 год). Моя цель - получить разную окраску фона в соответствии с переменным «CATEG» для двух подзадач. Любые предложения приветствуются.

1 Ответ

0 голосов
/ 05 июня 2019

Я думаю, что функция panel.xblocks - хороший подход. Использование subscripts и groups также удобно, но всегда требует некоторого переучивания для меня.

Запрос кондиционирования (|) генерирует subscripts. Аргумент groups используется для передачи значений CATEG в функцию панели. Это на самом деле не используется для какой-либо группировки здесь. ... в функции панели на самом деле также не используется, но это хорошая практика, если код изменяется, а другим функциям требуются аргументы, передаваемые вниз.

# Starting with data in 'myd' from above
# Load non-standard packages
  library(lattice)
  library(latticeExtra)

# Old school colors
  myCol <- c("salmon", "lightgray")
  names(myCol) <- levels(myd$CATEG)

# To use a different color for each level of 'CATEG' in each panel:
  obj1 <- xyplot(VAR ~ JD | factor(YEAR), data = myd,
    groups = CATEG, xlab = "", ylab = "",
    panel = function(x, y, subscripts, groups, ...) {
      panel.xblocks(x, myCol[groups][subscripts])
      panel.lines(x, y, col = 1)
    })

# Here's a solution to a different problem (second plot):
# How to use a different color for the first level of 'CATEG' in each panel 
  obj2 <- xyplot(VAR ~ JD | factor(YEAR), data = myd,
    xlab = "", ylab = "", groups = CATEG,
    panel = function(x, y, subscripts, groups, ...) {
      panel.xblocks(x, myCol[panel.number()][groups][subscripts])
      panel.lines(x, y, col = 1)
    })

# Plot in one device
  plot(obj1, position = c(0, 0.45, 1, 1), more = TRUE)
  plot(obj2, position = c(0, 0, 1, 0.55))

panel.xblocks solution and extra example

...