如何根据因子变量为xyplot的每个面板中的背景着色?

时间:2019-06-04 18:49:07

标签: r lattice

我正在尝试根据其他类别变量的不同值构造一个包含不同背景颜色的xyplot。使用panel.xblocks(程序包: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子图(2002年)中重复第一个xyplot子图(2001年)的背景色。我的目标是根据两个子图的可变“ CATEG”获得不同的背景色。欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

我认为panel.xblocks函数是一种很好的方法。 subscriptsgroups的使用也很方便,但始终需要我重新学习。

条件请求(|)生成subscriptsgroups参数用于将CATEG的值传递给面板函数。实际上,此处未将其用于任何分组。 panel函数中的...也不实际使用,但是如果代码被更改并且其他函数需要传递参数,这是一个好习惯。

# 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