已经有一段时间了,但事实证明,对 rhelp 档案的搜索找到了我 4 年前在那个地点所做的一项工作:我关于需要构建替代面板功能的论点是......“它需要一个小技巧才能panel.violin,因为在其本机状态panel.violin
下,网格绘图函数仅传递一个单元素向量。”
panel.violin.hack <-
function (x, y, box.ratio = 1, box.width = box.ratio/(1 + box.ratio),
horizontal = TRUE, alpha = plot.polygon$alpha, border =
plot.polygon$border,
lty = plot.polygon$lty, lwd = plot.polygon$lwd, col = plot.polygon
$col,
varwidth = FALSE, bw = NULL, adjust = NULL, kernel = NULL,
window = NULL, width = NULL, n = 50, from = NULL, to = NULL,
cut = NULL, na.rm = TRUE, ...)
{
if (all(is.na(x) | is.na(y)))
return()
x <- as.numeric(x)
y <- as.numeric(y)
plot.polygon <- trellis.par.get("plot.polygon")
darg <- list()
darg$bw <- bw
darg$adjust <- adjust
darg$kernel <- kernel
darg$window <- window
darg$width <- width
darg$n <- n
darg$from <- from
darg$to <- to
darg$cut <- cut
darg$na.rm <- na.rm
my.density <- function(x) {
ans <- try(do.call("density", c(list(x = x), darg)),
silent = TRUE)
if (inherits(ans, "try-error"))
list(x = rep(x[1], 3), y = c(0, 1, 0))
else ans
}
numeric.list <- if (horizontal)
split(x, factor(y))
else split(y, factor(x))
levels.fos <- as.numeric(names(numeric.list))
d.list <- lapply(numeric.list, my.density)
dx.list <- lapply(d.list, "[[", "x")
dy.list <- lapply(d.list, "[[", "y")
max.d <- sapply(dy.list, max)
if (varwidth)
max.d[] <- max(max.d)
xscale <- current.panel.limits()$xlim
yscale <- current.panel.limits()$ylim
height <- box.width
if (horizontal) {
for (i in seq_along(levels.fos)) {
if (is.finite(max.d[i])) {
pushViewport(viewport(y = unit(levels.fos[i],
"native"), height = unit(height, "native"),
yscale = c(max.d[i] * c(-1, 1)), xscale = xscale))
grid.polygon(x = c(dx.list[[i]], rev(dx.list[[i]])),
y = c(dy.list[[i]], -rev(dy.list[[i]])),
default.units = "native",
# this is the point at which the index is added
gp = gpar(fill = col[i], col = border, lty = lty,
lwd = lwd, alpha = alpha))
popViewport()
}
}
}
else {
for (i in seq_along(levels.fos)) {
if (is.finite(max.d[i])) {
pushViewport(viewport(x = unit(levels.fos[i],
"native"), width = unit(height, "native"),
xscale = c(max.d[i] * c(-1, 1)), yscale = yscale))
grid.polygon(y = c(dx.list[[i]], rev(dx.list[[i]])),
x = c(dy.list[[i]], -rev(dy.list[[i]])),
default.units = "native",
# this is the point at which the index is added
gp = gpar(fill = col[i], col = border, lty = lty,
lwd = lwd, alpha = alpha))
popViewport()
}
}
}
invisible()
}
还需要加载网格:
load(grid)
bwplot(y ~ x, data = df, horizontal=FALSE, xlab=unique(df$x), col=c("yellow", "green"),
panel = function(x,y, subscripts, col=col, ..., box.ratio){
panel.violin.hack(x,y, col=col, ..., varwidth = FALSE, box.ratio = 0.1)
panel.bwplot(x,y, ..., box.ratio = .1) },
)