【问题标题】:How to specify different ylim values for each panel in xyplot?如何为 xyplot 中的每个面板指定不同的 ylim 值?
【发布时间】:2012-06-22 18:02:33
【问题描述】:

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

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

【问题讨论】:

    标签: r lattice


    【解决方案1】:

    由于该问题仅发生在没有数据的因子组合中,因此您可以通过为每个因子组合“补充”数据来回避它。只要附加点位于绘制区域之外,它们的唯一作用就是确保触发设置适当 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)
    

    【讨论】:

    • 这很可爱。我在想也许可以使用 NA 值,但不知道这是否会成功。
    • @DWin 谢谢。使用 NA 是一个好主意,但在这里不起作用:结果是 prepanel.default.xyplot() 中的测试触发了对 prepanel.null() 的调用检查 any(!is.na(x)) &amp;&amp; any(!is.na(y)) 是否(有趣地)对于 any(!is.na(NA))any(!is.na(numeric(0))) 都失败了. (后者显然是 OP 的情况。)
    • 谢谢!之前想过做一些数据预处理,但是觉得会比较复杂。您的解决方法非常优雅。我想知道为什么 xyplot 不自动处理这些差距。
    猜你喜欢
    • 2015-10-24
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多