2010-07-02 17 views
13

使用position_jitter会产生随机抖动以防止数据点的重叠绘图。是否有可能以同样的方式抖动两个ggplot几何?

在下面我用棒球统计的例子来说明我的问题。当我用两层绘制相同的数据时,相同的抖动调用抖动几何图形有点不同。 这很有意义,因为它可能会在两次调用中独立产生随机抖动,但会产生您在下图中看到的问题。

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_normal调用添加行吗? alt text http://img339.imageshack.us/img339/1807/screenshot20100702at943.png

回答

7

这是目前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)) 
+2

hadley:你对ggplot2有任何更新,因为你回答了这个问题? – gvrocha 2015-09-22 22:46:07

8

我想是这样,通过设置所述种子是相同的两个实例:

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

这确保了作为被使用的随机数发生器被发送回相同的起始位置初次通话。但是我不知道如何提取添加到值中的随机增量。

+0

好主意,但它没有奏效!我认为它会工作,因为看起来像position_jitter使用基础包的抖动,我期望使用由set.seed播种的相同的随机数生成器。 我想一个通用的解决方法是创建我自己的抖动版本的x,但希望有更好的方法。 – 2010-07-02 12:31:13

+1

这不起作用,因为抖动是在绘图时完成的,而不是在创建时完成的。 – hadley 2010-07-02 19:29:10

+0

这对我来说非常合适。也许有关哈德利评论(4年前)以来的新版本。就我而言,这应该是新的答案。 – rcorty 2014-11-03 04:21:53

1

我最终生成均匀分布来解决这个问题。我不得不在今天解决同样的根本问题。我创建一个情节,抖动点,然后创建第二个情节,基本放大第一个情节的一个小节。如果点移动,这是不协调和分散注意力。

以下是该问题和我的解决方案的演示。我不使用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) 
    } 
相关问题