Как сделать 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
и вы указываете его местоположением каждой группы.