У вас есть три строки данных для каждой комбинации A
и B
, поэтому ваш текущий код фактически перекрывает три бара в каждой позиции оси x. Вы можете увидеть это, добавив прозрачность к барам.
ggplot(data, aes(fill=A, y=value, x=B)) +
geom_bar(stat="identity", position=position_dodge(), alpha=0.3)
Похоже, вы действительно пытаетесь сделать следующее (но пусть я знаю, если я неправильно понял):
pd = position_dodge(0.92)
data %>%
group_by(A,B) %>%
summarise(mean=mean(value), sd=sd(value)) %>%
ggplot(aes(fill=A, x=B)) +
geom_col(aes(y=mean), position=pd)+
geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), position=pd, width=0.2)
Фасеткой является еще один вариант:
data %>%
group_by(A,B) %>%
summarise(mean=mean(value), sd=sd(value)) %>%
ggplot(aes(x=A)) +
geom_col(aes(y=mean), fill=hcl(240,100,65)) +
geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=0.2) +
facet_grid(. ~ B, labeller=label_both, space="free_x", scales="free_x")
Но вам действительно нужны бары?
data %>%
group_by(A,B) %>%
summarise(mean=mean(value), sd=sd(value)) %>%
ggplot(aes(x=A)) +
geom_pointrange(aes(y=mean, ymin=mean-sd, ymax=mean+sd), shape=21, fill="red",
fatten=6, stroke=0.3) +
facet_grid(. ~ B, labeller=label_both, space="free_x", scales="free_x")
Мы также можем сделать этот расчет в ggplot, используя stat_summary
:
data %>%
ggplot(aes(x=A, y=value)) +
stat_summary(fun.data=mean_sdl, fun.args=list(mult=1), geom="pointrange",
shape=21, fill="red", fatten=6, stroke=0.3) +
facet_grid(. ~ B, labeller=label_both, space="free_x", scales="free_x")
В любом случае, сюжет выглядит так: