3

xyplotの各パネルのy軸に異なる制限を指定しようとしていますが、結果は異なるデータサブセットと一致していません。

この問題は、2つの異なるグループ化変数を使用してパネルスライスを定義し、1つ以上のサブグループにデータ値がない場合に発生します。

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

元のデータフレームの任意のサブセットで関数を機能させたいので、1つ以上のサブグループにデータ値がない可能性が非常に高くなります。

サブグループのデータ値がない場合でも、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 に答える