Можно ли так же дрожать две геометрии ggplot?

Использование 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_normal, чтобы добавить строки? alt text http://img339.imageshack.us/img339/1807/screenshot20100702at943.png

Ответы

Ответ 1

Это слабость в текущем синтаксисе 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

Я так думаю, установив, что семя будет одинаковым в двух экземплярах:

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

В результате я создал единый дистрибутив для решения этой проблемы.

Сегодня мне пришлось решить одну и ту же проблему. Я создаю один сюжет, дрожащий точки, а затем создаю второй сюжет, который существенно приближается к подразделению первого. Это диссонирует и отвлекает, если точки перемещаются.

Ниже приведена демонстрация проблемы и моего решения. Я не использую 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 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)
    }