Как сделать dodge в geom_bar согласен с dodge в geom_errorbar, geom_point

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

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

У меня возникают проблемы с тем, что уклонение в geom_bar согласуется с dodge на 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, чтобы согласиться с двумя другими?

Любая помощь была оценена.

Ответ 1

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

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

enter image description here

Ответ 2

Первое изменение я переформатировал код в соответствии с расширенным руководством по стилю 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. Затем я изменил аргумент позиции на "dodge" и добавил аргумент 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))

введите описание изображения здесь

Ответ 3

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

В

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

width -argument в position_dodge управляет шириной уклонения объектов, которые нужно уклониться друг от друга. Однако, это производит усы, столь же широкие как бары, что возможно нежелательно. Дополнительная ширина -argument за пределами 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) 

Ответ 4

иногда вы помещаете aes(x=tasks,y=val,fill=group) в geom_bar а не в ggplot. Это вызывает проблему, так как ggplot ожидает x и вы указываете его местоположением каждой группы.