如果我们查看源代码,我们首先发现这个:
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)))
}
所以......就是这样!
在这个上下文中,“resolution”大致意思是“向量中任意两个元素之间的最小距离”。
然后将该值(分辨率的40%)作为factor
参数传递给jitter
,它有自己的小技巧:
结果是r < - x + runif(n,-a,a),其中n < - length(x),
a是数量参数(如果指定的话)。
令z < - max(x)- min(x)(假设通常情况下),要添加的量a是
要么作为正参数量提供,否则通过以下方式计算:
如果amount == 0,则我们设置a < - factor * z / 50(与S相同)。
如果amount为NULL(默认值),则我们将a < - factor * d / 5,其中d是相邻唯一的(除了模糊)x值之间的最小差异。