【问题标题】:How to color background in each panel of an xyplot according to a factor variable?如何根据因子变量为 xyplot 的每个面板中的背景着色?
【发布时间】:2019-06-04 18:49:07
【问题描述】:

我正在尝试根据附加分类变量的不同值构建一个包含不同背景颜色的 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-subplot(2001 年)的背景颜色在第二个 xyplot-subplot(2002 年)中重复。我的目标是根据两个子图的变量“CATEG”获得不同的背景颜色。欢迎提出任何建议。

【问题讨论】:

  • 不清楚您是否希望 A 在每个面板中以不同的颜色突出显示,或者 A 和 B 在每个面板中都具有不同的颜色。我建议的答案显示使用 panel 函数和 groups 参数。
  • David O,您使用subscripts 方法的“在每个面板中为每个级别的 'CATEG' 使用不同的颜色”正是我想要的。
  • 很高兴听到。这对我来说是一个难题,我很高兴你问了这个问题。我建议对您的问题进行编辑,以便其他人更容易找到。如果修改后的问答有效,请考虑接受它以帮助其他人更容易找到它!

标签: r lattice


【解决方案1】:

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

调节请求 (|) 生成 subscriptsgroups 参数用于将 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))

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2020-08-04
    • 2013-09-14
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多