Можно ли так же дрожать две геометрии 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)
}