R中ggplot绘图无法按资助总额排序,group_by使用有误?
问题分析与修正方案
你的代码主要有两个核心问题,导致图表没按总资助额排序:
1. 未完成机构级别的资助额汇总
你只执行了group_by(ORG_NAME),但没有计算每个机构的总资助额,数据还是单条资助的记录,后续排序也是按单条资助金额来排,完全没达到"按机构总金额汇总"的目的。
2. 没有修改分类变量的排序规则
ggplot对分类变量(比如这里的ORG_NAME)默认按字母顺序排列,哪怕你给数据框排了序,ggplot还是会遵循因子的原始水平顺序,必须手动把机构名转为按总金额排序的因子。
修正后的完整代码
# 先确保加载必要的包(如果没装tidyverse,先跑 install.packages("tidyverse")) library(tidyverse) # 筛选300万美元以上的资助记录 mass_nih_big_grants <- filter(mass_NIH_data_2023_desc, TOTAL_COST >= 3000000) # 分组汇总+排序+重置因子水平 mass_nih_big_grantees <- mass_nih_big_grants %>% # 按机构分组 group_by(ORG_NAME) %>% # 计算每个机构的总资助额,命名为TOTAL_SUM summarize(TOTAL_SUM = sum(TOTAL_COST)) %>% # 按总资助额降序排序 arrange(desc(TOTAL_SUM)) %>% # 把机构名转为按总金额排序的因子(关键:让ggplot按这个顺序绘图) mutate(ORG_NAME = fct_reorder(ORG_NAME, TOTAL_SUM)) # 绘制条形图 plot_mass_nih_big_grantees <- ggplot(mass_nih_big_grantees, aes(x=ORG_NAME, y=TOTAL_SUM)) + geom_bar(stat="identity", fill="dodgerblue") + coord_flip() + theme_light() # 展示图表 plot_mass_nih_big_grantees
关键修正点说明
summarize(TOTAL_SUM = sum(TOTAL_COST)):这一步是核心,把每个机构的多条资助记录合并成一条总金额记录fct_reorder(ORG_NAME, TOTAL_SUM):用forcats包的函数重置因子水平,让ORG_NAME的顺序由TOTAL_SUM的大小决定,ggplot绘图时就会遵循这个顺序- 绘图时y轴用汇总后的
TOTAL_SUM,而不是原始的单条资助额TOTAL_COST
内容的提问来源于stack exchange,提问作者Lisa Williams
相关产品推荐
相关产品推荐

