我正在尝试为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轴具有正确的限制。
有关如何实现这一目标的任何想法?
答案 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)