Выравнивание баров ошибок с различным количеством баров на группу в ggplot2
Я пытался нанести столбцы ошибок на график в ggplot2 с разным количеством баров в группе. Мне бы хотелось:
- Фиксированная ширина баров независимо от количества баров в группе
- Столбики ошибок с одинаковой шириной усов, выровненные по соответствующим столбцам
Это должно быть довольно стандартным, но я борюсь с ошибками, так как настройки в position_dodge()
а также position_dodge2()
не так просты, как примеры в geom_crossbar()
и position_dodge
документация.
Моя ближайшая попытка:
df <- data.frame(
mean = 2:8,
loc = c(rep(1, 4), 2, rep(3, 2)),
# spcs = c(1:4, 1, 1:2),
spcs = c(1:4, 1, 2, 4) # Updated on 29 Dec 2018 in response to @Roman Luštrik's comment
)
ggplot(aes(x = factor(loc), y = mean, fill = factor(spcs)), data = df) +
geom_col(position = position_dodge2(preserve = "single")) +
geom_errorbar(
aes(ymin = mean - 0.2, ymax = mean + 0.2),
position = position_dodge(width = 0.9),
width = 0.2
)
Тем не менее, ни полосы ошибок не были выровнены с полосами (местоположение 3), и при этом они не имели такой же ширины усов, как я хотел (расположение 2 и 3).
Я погуглил и нашел здесь несколько похожих вопросов, но это не совсем мой случай. Поэтому я был бы признателен за решение с небольшим объяснением того, почему моя попытка не удалась.
пс. Я знаю, если я facet_grid()
от loc
и установить scales = "free_x", space = "free_x"
Я бы выбрал близкую альтернативу, но я бы не стал использовать здесь фасетку. Спасибо!
1 ответ
Если я добавлю dodge к ошибкам, я получу это:
ggplot(aes(x = factor(loc), y = mean, fill = factor(spcs)), data = df) +
geom_col(position = position_dodge(preserve = "single")) +
geom_errorbar(
aes(ymin = mean - 0.2, ymax = mean + 0.2),
position = position_dodge(width = 0.9, preserve = "single"),
width = 0.2)
РЕДАКТИРОВАТЬ
Я полагаю, что происходит некоторое отбрасывание факторов для комбинации факторов loc * spcs, но у меня сейчас недостаточно мотивации, чтобы проверить это. В любом случае, обходным решением будет добавление отсутствующих значений для отсутствующих факторов.
df <- data.frame(mean = 2:8, loc = c(rep(1, 4), 2, rep(3, 2)), spcs = c(1:4, 1, 2, 4))
df <- rbind(df, data.frame(mean = NA, loc = 3, spcs = c(1, 3)))
ggplot(aes(x = factor(loc), y = mean, fill = factor(spcs)), data = df) +
geom_col(position = position_dodge(preserve = "single")) +
geom_errorbar(
aes(ymin = mean - 0.2, ymax = mean + 0.2),
position = position_dodge(width = 0.9, preserve = "single"),
width = 0.2)