代码之家  ›  专栏  ›  技术社区  ›  Alex Holcombe

有没有可能以同样的方式抖动两个几何图形?

  •  15
  • Alex Holcombe  · 技术社区  · 15 年前

    使用位置抖动创建随机抖动,以防止数据点的过度绘制。

    这是有意义的,因为它可能会在两个调用中独立地生成随机抖动,但是会产生一个问题,您可以在下面的图表中看到。

    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\u cl\u普通调用也添加行? alt text

    3 回复  |  直到 6 年前
        1
  •  8
  •   Collin    15 年前

    这是当前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
  •  9
  •   nullglob    15 年前

    我想是的,通过在两个例子中设置相同的种子:

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

        3
  •  1
  •   rhileighalmgren    14 年前

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

    今天我必须解决同样的根本问题。我创建一个图,抖动点,然后创建第二个图,基本上放大第一个图的一个小节。这是不和谐和分散注意力,如果点移动。

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

    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)
        }
    
    推荐文章