如果我们查看源代码,我们首先会发现:
PositionJitter <- proto(Position, {
objname <- "jitter"
adjust <- function(., data) {
if (empty(data)) return(data.frame())
check_required_aesthetics(c("x", "y"), names(data), "position_jitter")
if (is.null(.$width)) .$width <- resolution(data$x, zero = FALSE) * 0.4
if (is.null(.$height)) .$height <- resolution(data$y, zero = FALSE) * 0.4
trans_x <- NULL
trans_y <- NULL
if(.$width > 0) {
trans_x <- function(x) jitter(x, amount = .$width)
}
if(.$height > 0) {
trans_y <- function(x) jitter(x, amount = .$height)
}
transform_position(data, trans_x, trans_y)
}
})
你不知道吗,它resolution
是一个导出的函数(或者你可以搜索它的来源,让你登陆这里):
function (x, zero = TRUE)
{
if (is.integer(x) || zero_range(range(x, na.rm = TRUE)))
return(1)
x <- unique(as.numeric(x))
if (zero) {
x <- unique(c(0, x))
}
min(diff(sort(x)))
}
所以……给你!
在这种情况下,“分辨率”大致意味着“向量中任意两个元素之间的最小距离”。
然后将该值(分辨率的 40%)作为factor
参数传递给jitter
,它有自己的小歌舞:
结果,比如 r,是 r <- x + runif(n, -a, a) 其中 n <- length(x) 并且 a 是数量参数(如果指定)。
让 z <- max(x) - min(x) (假设通常情况)。要添加的量 a 要么作为正参数量提供,要么以其他方式从 z 计算,如下所示:
如果数量 == 0,我们设置 <- 因子 * z/50(与 S 相同)。
如果数量为 NULL(默认),我们设置一个 <- 因子 * d/5,其中 d 是相邻唯一(除了模糊)x 值之间的最小差异。