在 ggplot2 中跨几何均匀应用抖动

Ric*_*der 4 r ggplot2

我想以相同的量抖动两个几何体。考虑以下最小示例:

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)

产生以下图: ggplots

在这两种情况下,抖动都是随机的(点和线范围位于不同的位置),而我希望它们对于每个数据点(相应线范围中间的点)保持一致。这可能吗?

请注意,我不会考虑手动向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)

dc3*_*c37 5

使用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)

在此处输入图片说明

它回答你的问题吗?

  • 是的,但是你可以让它使用与这个怪物相同的抖动 yb 设置种子:`ggplot(pdat, aes(x={set.seed(123); jitter(x)},y=y ...` (4认同)
  • @user20650,有趣的抖动调用;)我不知道这种写作:D 感谢分享。 (3认同)