R 是否可以以相同的方式抖动两个ggplot几何图形?

R 是否可以以相同的方式抖动两个ggplot几何图形?,r,ggplot2,R,Ggplot2,使用position_jitter创建随机抖动,以防止数据点过度拼接 在下面的例子中,我用棒球统计数据来说明我的问题。当我用两层绘制相同的数据时,相同的抖动调用对几何图形的抖动略有不同。 这是有意义的,因为它可能会在两个调用中独立地生成随机抖动,但会产生下面的图表中所示的问题 p=ggplot(baseball,aes(x=round(year,-1),y=sb,color=factor(lg))) p=p+stat_summary(fun.data="mean_cl_normal",posi

使用position_jitter创建随机抖动,以防止数据点过度拼接

在下面的例子中,我用棒球统计数据来说明我的问题。当我用两层绘制相同的数据时,相同的抖动调用对几何图形的抖动略有不同。 这是有意义的,因为它可能会在两个调用中独立地生成随机抖动,但会产生下面的图表中所示的问题

p=ggplot(baseball,aes(x=round(year,-1),y=sb,color=factor(lg))) 
p=p+stat_summary(fun.data="mean_cl_normal",position=position_jitter(width=3,height=0))+coord_cartesian(ylim=c(0,40))
p+stat_summary(fun.y=mean,geom="line",position=position_jitter(width=3,height=0))
虽然错误条点和线引用相同的数据,但它们是不相交的,因为线和点不连接

这有什么办法吗?我认为道奇位置可能是答案,但它似乎不适用于这些类型的情节。或者,也许有办法让mean_cl_普通呼叫也添加线路?

我认为是这样,通过在两种情况下设置相同的种子:

p=ggplot(baseball,aes(x=round(year,-1),y=sb,color=factor(lg)))
myseed = 2010
set.seed(myseed)
p=p+stat_summary(fun.data="mean_cl_normal",
  position=position_jitter(width=3,height=0))+coord_cartesian(ylim=c(0,40))
set.seed(myseed)
p+stat_summary(fun.y=mean,geom="line",
           position=position_jitter(width=3,height=0))

这样可以确保随机数生成器被发送回初始调用中使用的相同起始位置。但是,我不知道如何提取添加到值中的随机增量。

这是当前ggplot2语法中的一个弱点-除了自己添加抖动之外,没有办法解决它

或者你可以这样做:

ggplot(baseball, aes(round(year,-1) + as.numeric(factor(lg)), sb, color = factor(lg))) +
  stat_summary(fun.data="mean_cl_normal") +
  stat_summary(fun.y=mean,geom="line") +
  coord_cartesian(ylim=c(0,40))

我最终生成了一个均匀分布来解决这个问题

我今天必须解决同样的根本问题。我创建一个图,抖动点,然后创建第二个图,基本上放大第一个图的一部分。如果这些点四处移动,就会产生不和谐和分心

下面是这个问题的演示和我的解决方案。我不使用ggplot进行此绘图,但同样的概念也适用。我做了一个均匀的分布,每个需要抖动的值对应一个值。我将其添加到源数据帧中,以便每次获取子集时,抖动值都对应于相同的原始数据值

data(airquality)
someDataset= airquality 
someDataset$color="black"
someDataset$color[someDataset$Month==8 & someDataset$Wind==9.7]="red"
## jitter gives different results each time it's run
for (fZoom in c(TRUE, FALSE)){
    if (fZoom) myAirQuality = someDataset[someDataset $Wind >7.5 & someDataset $Wind < 11.5,] 
    else myAirQuality = someDataset[someDataset $Wind >8.5 & someDataset $Wind < 10.5,]
    quartz("Using Jitter")
    plot(myAirQuality $Wind ~ jitter(myAirQuality $Month), col= myAirQuality$color)
    }

someDataset$MonthJit=runif(nrow(someDataset), min=-0.2, max=0.2)
for (fZoom in c(TRUE, FALSE)){
    if (fZoom) myAirQuality = someDataset[someDataset $Wind >7.5 & someDataset $Wind < 11.5,] 
    else myAirQuality = someDataset[someDataset $Wind >8.5 & someDataset $Wind < 10.5,]
    quartz("Using runif")
    plot(myAirQuality $Wind ~ c(myAirQuality $Month + myAirQuality $MonthJit), col= myAirQuality$color)
    }
数据(空气质量)
someDataset=空气质量
someDataset$color=“黑色”
someDataset$color[someDataset$Month==8和someDataset$Wind==9.7]=“红色”
##抖动每次运行时都会产生不同的结果
用于(放大c(真、假)){
如果(fZoom)myAirQuality=someDataset[someDataset$Wind>7.5和someDataset$Wind<11.5,]
else myAirQuality=someDataset[someDataset$Wind>8.5和someDataset$Wind<10.5,]
石英(“使用抖动”)
绘图(myAirQuality$风~抖动(myAirQuality$月),col=myAirQuality$颜色)
}
someDataset$MonthJit=runif(nrow(someDataset),min=-0.2,max=0.2)
用于(放大c(真、假)){
如果(fZoom)myAirQuality=someDataset[someDataset$Wind>7.5和someDataset$Wind<11.5,]
else myAirQuality=someDataset[someDataset$Wind>8.5和someDataset$Wind<10.5,]
石英(“使用runif”)
绘图(myAirQuality$Wind~c(myAirQuality$Month+myAirQuality$MonthJit),col=myAirQuality$color)
}

好主意,但没用!我认为它会起作用,因为看起来position_jitter使用的是基本包的jitter,我希望它使用的是set.seed播种的同一个随机数生成器。我想一个通用的解决方法是创建我自己的抖动版本的x,但希望有更好的方法。这不会起作用,因为抖动是在绘图时完成的,而不是在创建时。这对我来说非常有效。也许是哈德利评论(4年前)后的新版本。就我而言,这应该是一个新的答案。不幸的是,我似乎无法让这一切为我所用。相对于他们的酒吧,积分无处不在。也许检查一下答案哈德利:自从你回答这个问题以来,ggplot2有没有更新?