Проблема с ggplot2, полосой geom _и position="dodge" :имеет правильные значения y,увернулся не

У меня довольно много времени на понимание 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")

stacked plot

В частности, обратите внимание на максимальное значение y. Они представляют собой суммы данных из testсо значениями test2, показанными синим цветом сверху.

Основываясь на других вопросах, которые я прочитал, мне просто нужно добавить position="dodge", чтобы сделать его боковым -на -побочным графиком по сравнению с составным:

ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
geom_bar(stat="identity", position="dodge")

dodged

Это выглядит великолепно, но обратите внимание на новые максимальные значения 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

correct

17
задан Community 23 May 2017 в 10:30
поделиться