Выравнивание баров ошибок с различным количеством баров на группу в 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)

Другие вопросы по тегам