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

R 如何为xyplot中的每个面板指定不同的ylim值?,r,lattice,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<-

我试图为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)
## 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)
我希望我的函数适用于原始数据帧的任何子集,因此很可能一个或多个子组没有数据值

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


关于如何实现这一点,您有什么想法吗?

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

这是可行的,并且比使用
prepanel.default.xyplot()
prepanel.null()
limits.and.aspect()
limitsFromLimitList()
,以及为没有数据的面板设置限制所涉及的任何其他函数都要简单

下面是一个例子:

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)
## 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)
##创建一个补充数据框,每个因子级别有一个数据点

笨蛋,真可爱。我在考虑可能使用NA值,但不知道是否会成功。@DWin谢谢。使用NA是个好主意,但在这里不起作用:结果是
prepanel.default.xyplot()
中的测试触发调用
prepanel.null()
检查
any(!is.NA(x))和&any(!is.NA(y))
,有趣的是,
any(!is.NA(NA))
any(!is.NA(数值(0))
。(后者显然是OP的情况)谢谢!我以前想过做一些数据预处理,但我觉得会更复杂。你的解决方法相当优雅。我想知道为什么xyplot不能自动处理这些间隙。