У меня есть понимание времени geom_bar()
и position="dodge"
. Я пытался сделать несколько гистограмм, иллюстрирующих две группы. Первоначально данные были получены из двух отдельных кадров данных. Per этот вопрос, я поместил свои данные в длинный формат. Мой пример:
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 max. Они представляют собой суммы данных из test
со значениями test2
, отображаемыми синим цветом сверху.
В соответствии с другими вопросами, которые я прочитал, мне просто нужно добавить position="dodge"
, чтобы сделать его бок о бок, а также сложным:
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity", position="dodge")
Это выглядит великолепно, но обратите внимание на новые значения max y. Похоже, что он просто принимает значение max y с каждого уровня факторов имен от test
для значения y. Он больше не суммирует их.
По другим вопросам (например этот и этот, я также попытался добавить group=
без успеха (создает тот же самый уклоненный график, что и выше):
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(num))) +
geom_bar(stat="identity", position="dodge")
Я не понимаю, почему многослойные работы отлично работают, а уклонение не просто ставит их бок о бок, а не сверху.
ETA: Я нашел недавний вопрос об этом в группе ggplot google с предложением добавить alpha=0.5
, чтобы узнать, что происходит. Дело не в том, что ggplot принимает максимальное значение от каждой группы; он фактически перекрывает планшеты поверх друг друга для каждого значения.
Кажется, что при использовании position="dodge"
ggplot ожидает только одного y за x. Я связался с Уинстоном Чангом, разработчиком ggplot, чтобы подтвердить это, а также узнать, можно ли это изменить, поскольку я не вижу преимущества.
Кажется, что stat="identity"
должен сказать ggplot, чтобы подсчитать y=val
, переданный внутри aes()
, вместо отдельных счетчиков, который происходит без stat="identity"
и при передаче значения y.
В настоящее время обходной путь кажется (для исходного df выше) агрегировать, так что только один y на x:
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