Как заставить dodge в geom_bar согласиться с dodge в geom_errorbar, geom_point

У меня есть набор данных, где измерения сделаны для разных групп в разные дни.

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

У меня проблемы с уклонениемgeom_bar согласен с уловкой наgeom_errorbar.

Вот простой кусок кода:

days          = data.frame(day=c(0,1,8,15));
groups        = data.frame(group=c("A","B","C","D", "E"), means=seq(0,1,length=5));


my_data       = merge(days, groups);


my_data$mid   = exp(my_data$means+rnorm(nrow(my_data), sd=0.25));
my_data$sigma = 0.1;


png(file="bar_and_errors_example.png", height=900, width=1200);
plot(ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) +
     geom_bar      (position=position_dodge(width=0.5))                                   +
     geom_errorbar (position=position_dodge(width=0.5), colour="black")                   +
     geom_point    (position=position_dodge(width=0.5), aes(y=mid, colour=group)));
dev.off();

На графике сегменты ошибок появляются с фиксированным смещением относительно своей полосы (извините, для новичков не допускаются графики, даже если субъектом является ggplot2).

Когда ширина бина регулируется вgeom_barсмещение не фиксируется и меняется изо дня в день.

Заметить, чтоgeom_errorbar а такжеgeom_point увернуться в тандеме. Как я могу получитьgeom_bar согласиться с двумя другими?

Любая помощь приветствуется.

Ответы на вопрос(3)

но так как я столкнулся с проблемой сегодня, я хочу добавить следующее:

В

 geom_bar(position = position_dodge(width=0.9), stat = "identity") + 
   geom_errorbar( position = position_dodge(width=0.9), colour="black") 

widthаргумент вposition_dodge контролирует ширину уклонения вещей, чтобы увернуться друг от друга. Однако, это производит усы, столь же широкие как бары, что возможно нежелательно. Дополнительный аргумент width за пределами position_dodge контролирует ширину усов (и баров):

 geom_bar(position = position_dodge(width=0.9), stat = "identity", width=0.7) + 
   geom_errorbar( position = position_dodge(width=0.9), colour="black", width=0.3) 
 Peter Harrison06 авг. 2018 г., 16:32
Это было единственное решение, которое сработало для меня.
 Herman Toothrot26 апр. 2018 г., 17:46
Я заметил эту проблему, но использование ширины меняет положение усов, и теперь они больше не выровнены с планками

что ваши столбцы не представляют данные, которые вы намереваетесь. Следующие строки выстроены правильно:

ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) +
     geom_bar      (position=position_dodge(), aes(y=mid), stat="identity") +
     geom_errorbar (position=position_dodge(width=0.9), colour="black") +
     geom_point    (position=position_dodge(width=0.9), aes(y=mid, colour=group))

 Brian Diggs18 мая 2018 г., 21:44
@HermanToothrot Я не думаю, что есть какая-то разница, но я не могу сказать это точно.
 Herman Toothrot03 мая 2018 г., 13:00
Спасибо Брайан, я думаю, что мне интересно, в чем разница между position = position_dodge () и position = "dodge"?
 Herman Toothrot26 апр. 2018 г., 17:38
он не находит position.dodge (), это было заменено position = 'dodge'? У меня похожая проблема, и я использовал ваше решение, но если я не установлю ширину полос ошибок рядом с 1, полоски ошибок не будут совпадать с geom_bars.
 Brian Diggs02 мая 2018 г., 23:43
@HermanToothrot Я только что проверил иposition_dodge это функция вggplot2 версия 2.2.1 (которая является самой последней версией на момент написания этого комментария). Я хотел бы отметить, что разделитель в имени функции является подчеркиванием (_), а не точка (.). Возможно, поэтому ваш код не нашел его.

Первое изменение я переформатировал код в соответствии срасширенное руководство по стилю R.

days <- data.frame(day=c(0,1,8,15))

groups <- data.frame(
    group=c("A","B","C","D", "E"), 
    means=seq(0,1,length=5)
    )

my_data <- merge(days, groups)

my_data$mid <- exp(my_data$means+rnorm(nrow(my_data), sd=0.25))
my_data$sigma <- 0.1

Теперь, когда мы смотрим на данные, мы видим, что день является фактором, а все остальное остается тем же.

str(my_data)

Чтобы удалить пустое пространство на графике, я преобразовал столбец дня в факторы. Проверьте, чтобы уровни были в правильном порядке, прежде чем продолжить.

my_data$day <- as.factor(my_data$day) 
levels(my_data$day)

Следующее изменение, которое я сделал, было определение y в вашемaes аргументы. Как я уверен, вы знаете, это позволяет ggplot знать, где искать значения y. Затем я изменил аргумент позиции на «увернуться» и добавилstat="identity" аргумент."identity" Аргумент говорит ggplot построить y в точке x.geom_errorbar наследует позицию уклонения отgeom_bar так что вы можете оставить это неуказанным, ноgeom_point не так, вы должны указать это значение. Уклонение по умолчаниюposition_dodge(.9).

ggplot(data = my_data, 
 aes(x=day,
     y= mid, 
     ymin=mid-sigma, 
     ymax=mid+sigma,       
     fill=group)) +
   geom_bar(position="dodge", stat = "identity") + 
   geom_errorbar( position = position_dodge(), colour="black") +
   geom_point(position=position_dodge(.9), aes(y=mid, colour=group))

Ваш ответ на вопрос