У меня довольно много времени на понимание geom_bar()
и position="dodge"
. Я пытался сделать несколько гистограмм, иллюстрирующих две группы. Первоначально данные были из двух отдельных фреймов данных. Согласно этому вопросу , я поместил свои данные в длинный формат. Мой пример:
test <- data.frame(names=rep(c("A","B","C"), 5), values=1:15)
test2 <- data.frame(names=c("A","B","C"), values=5:7)
df <- data.frame(names=c(paste(test$names), paste(test2$names)), num=c(rep(1,
nrow(test)), rep(2, nrow(test2))), values=c(test$values, test2$values))
Я использую этот пример, так как он похож на пример с расходами и бюджетом. Расходы имеют много строк на names
факторный уровень, тогда как бюджет имеет только одну (одну сумму бюджета на категорию ).
Для гистограммы с накоплением это работает отлично:
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity")
В частности, обратите внимание на максимальное значение y. Они представляют собой суммы данных из test
со значениями test2
, показанными синим цветом сверху.
Основываясь на других вопросах, которые я прочитал, мне просто нужно добавить position="dodge"
, чтобы сделать его боковым -на -побочным графиком по сравнению с составным:
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity", position="dodge")
Это выглядит великолепно, но обратите внимание на новые максимальные значения y. Кажется, что он просто берет максимальное значение y из каждого уровня фактора имен из test
для значения y. Их больше не суммируют.
По некоторым другим вопросам (, например этот и этот , я также безуспешно пытался добавить параметр group=
(дает тот же уклончивый график, что и выше):
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(num))) +
geom_bar(stat="identity", position="dodge")
Я не понимаю, почему стек отлично работает, а уклонение не просто кладет их рядом, а не сверху.
Расчетное время прибытия:Я нашел недавний вопрос об этом в группе ggplot google с предложением добавить alpha=0.5
, чтобы увидеть, что происходит. Дело не в том, что ggplot берет максимальное значение из каждой группы; на самом деле это более чем -построение столбцов друг над другом для каждого значения.
Кажется, что при использовании position="dodge"
ggplot ожидает только один y на x. Я связался с Уинстоном Чангом,разработчик ggplot об этом, чтобы подтвердить, а также узнать, можно ли это изменить, поскольку я не вижу преимущества.
Кажется, что stat="identity"
должен указать ggplot подсчитывать y=val
, переданные внутри aes()
, вместо отдельных подсчетов, которые происходят без stat="identity"
и при передаче значения y.
На данный момент обходной путь, по-видимому, (для исходной df выше )для агрегирования, поэтому на x приходится только один y:
df2 <- aggregate(df$values, by=list(df$names, df$num), FUN=sum)
p <- ggplot(df2, aes(x=Group.1, y=x, fill=factor(Group.2)))
p <- p + geom_bar(stat="identity", position="dodge")
p