3

我试图为 xyplot 中每个面板的 y 轴指定不同的限制,但结果与不同的数据子集不一致。

当我用两个不同的分组变量定义面板切片并且一个或多个子组没有数据值时,就会出现问题。

似乎 xyplot 正在跳过没有数据的面板的轴准备。

这是一个例子:

library(lattice)

df1<-data.frame(
          x=rep(1, 4),y=rep(1, 4), cat1=c('A','B','A','B'), cat2=c('1','1','2','2'))
df2<-data.frame(
          x=rep(1, 3),y=rep(1, 3), cat1=c('A','B','A'), cat2=c('1','2','1'))

myFun <-  function(df)  {
  print(
      xyplot(y ~ x | cat1 * cat2,
      data=df,
      scales=list(
          y=list(
              relation='free', 
              limits=rep(list(c(0,10), c(-100,10)) , 2)))
  ) )
}

myFun(df1)
myFun(df2)

df1 有每个子组的可用数据,而 df2 没有。当我调用 myFun(df1) 时,它按预期工作,但 myFun(df2) 会引发以下错误。

>   myFun(df2)
Warning message:
In limitsFromLimitlist(have.lim = have.ylim, lim = ylim, relation = y.relation,  :
  number of items to replace is not a multiple of replacement length

我希望我的函数适用于原始数据框的任何子集,因此一个或多个子组很可能没有数据值。

如果子组没有数据值,我仍然希望看到具有正确限制的 y 轴。

关于如何实现这一目标的任何想法?

4

1 回答 1

3

由于该问题仅发生在没有数据的因子组合中,因此您可以通过为每个因子组合“补充”数据来回避它。只要附加点位于绘制区域之外,它们的唯一作用就是确保触发设置适当 y 限制所需的面板和预面板准备工作。

这很有效,并且比使用prepanel.default.xyplot()prepanel.null()limits.and.aspect()limitsFromLimitList()任何其他函数来设置没有数据的面板的限制更简单!

这是一个例子:

## Create a supplementary data frame with one data point for each factor level
dummy <- with(df2, expand.grid(cat1=levels(cat1), cat2=levels(cat2)))
dummy <- data.frame(x=1, y=1e6, dummy)

## Append it to your data frame
df2 <- rbind(df2, dummy)

## Now try plotting it
myFun(df2)

在此处输入图像描述

于 2012-06-22T18:50:35.430 回答