微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不按填充值订购geom_col

如何解决不按填充值订购geom_col

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

示例

library(ggplot2)
library(data.table)

example_df <- data.frame(gender = c('M','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,label=name),vjust=1)

example plot

如果您可以在这里看到,则左侧正是我想要的。 Jack在M颜色上标记为10,Kate在F颜色上标记为20。右侧虽然是错误的。 Nassrin的标签为30,但在高度为40的M颜色上。这是因为geom_col认情况下是按填充顺序排序的,它会按字母顺序转换为因子。我在这里想要的是将左边的图排序为M,F,而将右边的图排序为M,F。这可能吗?或者是对我的累计金额重新排序的最佳解决方案(这将导致与我预期不同的情节)。

解决方法

分别设置groupfill。堆叠顺序(即 position )由group控制,当您未定义它自动设置时(在这种情况下,fill的定义是用过的)。所以:

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,label=name),vjust=1)

enter image description here

请注意,我们也可以让ggplot为我们做累计金额。然后,我们可以只使用原始的data.frame,将您的绘图简化为:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。