我想以相同的量抖动两个几何体。考虑以下最小示例:
library(ggplot2)
pdat <- data.frame(x = c(1,1,2,2,4,4,8,8),
y = c(1,1.1,2,2.2,3,3.3,4,4.4),
ymin = c(1,1.1,2,2.2,3,3.3,4,4.4)-.9^(0:7),
ymax = c(1,1.1,2,2.2,3,3.3,4,4.4)+.9^(0:7),
colour = as.factor(rep(1:2,4)))
ggplot(pdat, aes(x=x,y=y,ymin=ymin,ymax=ymax,color=colour)) +
geom_linerange(position='jitter') + geom_point(position='jitter')
ggplot(pdat, aes(x=jitter(x),y=y,ymin=ymin,ymax=ymax,color=colour)) +
geom_linerange() + geom_point()
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,抖动都是随机的(点和线范围位于不同的位置),而我希望它们对于每个数据点(相应线范围中间的点)保持一致。这可能吗?
请注意,我不会考虑手动向x
变量添加噪声作为解决方案,因为这会破坏应用坐标变换的能力。例如,限定pdat$x2 <- pdat$x+rnorm(8)/10
,
ggplot(pdat, aes(x=x2,y=y,ymin=ymin,ymax=ymax,color=colour)) +
geom_linerange() + geom_point()
Run Code Online (Sandbox Code Playgroud)
看起来不错,但是抖动的方差会受到任何后续转换的影响,如下所示
ggplot(pdat,aes(x=x2,y=y,ymin=ymin,ymax=ymax,color=colour)) +
geom_linerange() + geom_point() + scale_x_log10()
Run Code Online (Sandbox Code Playgroud)
使用position_jitter
函数,您可以添加一个seed
值以获得可重现的抖动效果:
library(ggplot2)
ggplot(pdat, aes(x = x, y = y, ymin = ymin, ymax = ymax, color = colour))+
geom_point(position = position_jitter(seed = 123, width =0.2))+
geom_linerange(position = position_jitter(seed = 123, width = 0.2))
Run Code Online (Sandbox Code Playgroud)
它回答你的问题吗?