7

少し前に、棒グラフで未使用の要素を削除する方法について質問しました。@ Aaronのおかげで、その問題の有用な解決策を得ることができました。今、私は非常によく似た問題に直面していますが、過去に使用した解決策はこの場合には機能しません。

これは、私が使用しているデータフレームを再現するためのコードです。

set.seed(17)
df <- data.frame(BENCH = sprintf('bench-%s', sort(rep(letters[1:8], 4))),
                 CLASS.CFG = sprintf('class-%s',
                     c(rep('C', 4), rep('A', 4), rep('B', 8),
                       rep('C', 8), rep('A', 4), rep('D', 4))),
                 EXEC.CFG = rep(c('st', 'st', 'dyn', 'dyn'), 8),
                 METRIC = rep(c('ipc', 'pwr'), 16),
                 VALUE = runif(32))

このデータフレームをプロットする簡単なコマンドは次のとおりです。

library(lattice)
barchart(VALUE ~ BENCH | EXEC.CFG + CLASS.CFG, df, groups = METRIC,
         scales = list(x = list(rot = 45, relation = 'free')),
         auto.key = list(columns = 2))

ご覧のとおり、EXEC.CFGとCLASS.CFGのすべての可能な組み合わせに制約された各BENCHのVALUEをプロットし(ネストされた要素で意味します)、METRICを使用してグループを作成しています。

これは私が得た結果です:

plot_with_gaps

X軸に「フリー」スケールを使用した場合でも、プロットでは、いくつかのバーの間にいくつかの(不要な)ギャップがあります(たとえば、との間bench-bbench-g

前の質問で得た解決策を次のように適用しようとしました。

pl1 <- barchart(VALUE ~ BENCH | EXEC.CFG + CLASS.CFG,
    subset(df, CLASS.CFG == 'class-A'), groups = METRIC,
    auto.key = list(columns = 2))
pl2 <- barchart(VALUE ~ BENCH | EXEC.CFG + CLASS.CFG,
    subset(df, CLASS.CFG == 'class-B'), groups = METRIC)
pl3 <- barchart(VALUE ~ BENCH | EXEC.CFG + CLASS.CFG,
    subset(df, CLASS.CFG == 'class-C'), groups = METRIC)
pl4 <- barchart(VALUE ~ BENCH | EXEC.CFG + CLASS.CFG,
    subset(df, CLASS.CFG == 'class-D'), groups = METRIC)

pls <- c(pl1, pl2, pl3, pl4)
pls <- update(pls, scales = list(y = 'same'))
pls

そして、これは私が得た結果です:

間違ったプロット

お気づきのように、このプロットは正しくありません。パネルタイトルにCLASS.CFGとEXEC.CFGの値が混在しているため、ネストされた要素は尊重されません。

私はしばらくこれと戦ってきましたが、成功しませんでした。誰かがこれをどのように達成できるか知っていますか?(基本的に、私が取得しようとしているのは、最初のプロットのようなプロットですが、バーの間にギャップはありません)。

4

1 に答える 1

7

prepanelこれを行うには、変更された関数(各パネルのプロット領域の制限を設定する)と変更されたpanel関数(データのプロットを担当する)の両方を提供する必要があります。どちらの場合も、重要な変更はx[, drop=TRUE]、未使用のレベルを削除するために使用することです。

library(lattice)

barchart(VALUE ~ BENCH | EXEC.CFG + CLASS.CFG, df, groups = METRIC,
         scales = list(x = list(rot = 45, relation = 'free')),
         prepanel = function(x,y,...) {
             xx <- x[, drop = TRUE]
             list(xlim = levels(xx),
                  xat=sort(unique(as.numeric(xx))))
         },
         panel = function(x,y,...) {
             xx <- x[, drop = TRUE]
             panel.barchart(xx, y, ...)
         },
         auto.key = list(columns = 2))

ここに画像の説明を入力してください

于 2013-01-22T17:32:51.127 に答える