#r #ggplot2
Вопрос:
Минимальный воспроизводимый пример приведен здесь:
library(ggplot2)
vals <- c(10, 12, 13, 20, 21, 28)
err <- c(0.85, 1.2, 0.9, 1.35, 2.2, 0.98)
cat <- c(rep("A",3),rep("B",3))
df <- data.frame(vals, err, cat)
df$cat<- as.factor(df$cat)
ggplot(df, aes(x=cat, y=vals, fill=vals))
geom_bar(stat='identity', position='dodge')
geom_errorbar(aes(ymin=vals-err, ymax=vals err), width=.1)
Этот код возвращает такой сюжет:
однако я ожидал, что две колонки будут расположены рядом друг с другом cat
. Ближе к этому:
Что я здесь делаю не так?
Комментарии:
1. Я считаю, что непрерывное заполнение сбивает с толку
"dodge"
. Один из вариантов-переключиться на использование"dodge2"
. В качестве альтернативы добавьтеgroup = factor(vals)
в свой глобальныйaes()
, чтобы dodge знал категории, от которых нужно уклоняться. Я думаю, что последнее может быть проще всего, если вы собираетесь добавить уклоняющиеся бары
Ответ №1:
Если каждая строка представляет собой отдельное наблюдение, вам нужно сделать это явным. Сделайте переменную индекса, превратите ее в коэффициент и поместите ее на ось x.
Если obs
повторяется в разных категориях (например, если и A, и B имеют obs
номера 1, 2 и 3), то грань на cat
с. facet_wrap(~ cat)
vals <- c(10, 12, 13, 20, 21, 28)
err <- c(0.85, 1.2, 0.9, 1.35, 2.2, 0.98)
cat <- c(rep("A",3),rep("B",3))
df <- data.frame(vals, err, cat)
df$cat<- as.factor(df$cat)
df$obs <- factor(1:nrow(df))
ggplot(df, aes(x=obs, y=vals, fill=cat))
geom_col(position='dodge')
geom_errorbar(aes(ymin=vals-err, ymax=vals err))