如何在xyplot中为每个面板指定不同的ylim值?

时间:2012-06-22 18:02:33

标签: r lattice

我正在尝试为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轴具有正确的限制。

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

1 个答案:

答案 0 :(得分: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)

enter image description here