前段时间我问了一个关于如何删除条形图中未使用因子的问题,我得到了一个有用的解决方案,感谢@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))
Run Code Online (Sandbox Code Playgroud)
绘制此数据框的简单命令是:
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))
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在为每个BENCH绘制VALUE约束到EXEC.CFG和CLASS.CFG的每个可能组合(这就是我对嵌套因子的意思),并使用METRIC创建组.
这是我获得的结果:

即使我对X轴使用"自由"刻度,在绘图中一些条之间也存在一些(不必要的)间隙(例如,在bench-b和之间bench-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
Run Code Online (Sandbox Code Playgroud)
这是我获得的结果:

正如您将注意到的,这个情节不正确.它不尊重嵌套因子,在面板标题中混合来自CLASS.CFG和EXEC.CFG的值.
我已经和它斗争了一段时间,但没有成功.有谁知道如何实现这一目标?(基本上,我想要获得的是一个类似第一个的情节,但没有条纹之间的间隙).
为此,您需要提供修改后的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))
Run Code Online (Sandbox Code Playgroud)
