排序 geom_col 不是按填充值

Ordering geom_col NOT by fill value

请抵制跳入定义因素水平的直觉。我正在尝试制作带有文本注释的条形图。我将 geom_col 与 y 值美学一起使用,并且将 geom_text 与单独的数据框一起使用,其中值已转换为累计和。这里的顺序很重要,我想根据计算累积和的相同顺序进行绘图。

示例

library(ggplot2)
library(data.table)

example_df <- data.frame(gender = c('M', 'F', 'F', 'M'), month = c('1', '1', '2', '2'), 
           value = c(10, 20, 30, 40), name = c('Jack', 'Kate', 'Nassrin', 'Malik'))
setDT(example_df)
text_df <- example_df[, .(value=cumsum(value), name=name), by='month']

ggplot(example_df) + geom_col(aes(x=month, y=value, fill=gender)) +
  geom_text(data=text_df, aes(x=month, y=value, label=name), vjust=1)

如果你能看到这里,左边正是我想要的。杰克在 M 颜色上被标记为 10,凯特在 F 颜色上被标记为 20。右边虽然是错误的。 Nassrin 被标记为 30,但在高度为 40 的 M 颜色之上。这是因为 geom_col 默认按填充顺序排列,它被转换为按字母顺序排列的因子。我在这里想要的是左边的图被排序为 M、F,而右边的图被排序为 F、M。这可能吗?或者是重新排序我的累计总和的最佳解决方案(这会导致与我预期的不同的情节)。

分别设置groupfill。堆叠的顺序(即 position)由 group 控制,当你没有定义时它会自动设置(在这种情况下 [=13 的定义=] 被使用)。所以:

ggplot(example_df) + 
  geom_col(aes(x=month, y=value, group = fct_rev(fct_inorder(name)), fill = gender)) +
  geom_text(data=text_df, aes(x=month, y=value, label=name), vjust=1)

请注意,我们也可以让 ggplot 为我们计算累加和。然后我们可以只使用原始的 data.frame,将您的情节简化为:

ggplot(example_df, aes(month, value, group = fct_rev(fct_inorder(name)),)) + 
  geom_col(aes(fill = gender)) +
  geom_text(aes(label = name), position = 'stack', vjust = 1)