geom_col()中Transportation Mode字段排序控制技术问询
解决ggplot2分面内自定义排序问题
以下是实现需求的具体步骤,核心思路是通过自定义优先级+分面内数值排序生成有序因子:
步骤1:计算分面内各类型的总和
先用dplyr分组计算每个分面下不同Transportation Mode的SUM值,后续用于排序:
library(dplyr) # 假设你的数据框名为df,分面字段为facet_var,度量值字段为value sum_df <- df %>% group_by(facet_var, measure_summary) %>% summarise(total = sum(value, na.rm = TRUE), .groups = "drop")
步骤2:定义排序优先级
给指定类别分配固定优先级,确保Personal Vehicles、Pedestrians的位置,小计放在最后:
sum_df <- sum_df %>% mutate( priority = case_when( measure_summary == "Personal Vehicles" ~ 1, measure_summary == "Pedestrians" ~ 2, measure_summary == "小计" ~ 99, # 替换成你实际的小计名称 TRUE ~ 3 ) )
步骤3:生成分面内的排序规则
在每个分面内,先按优先级排序,优先级为3的类别再按总和降序排列,最后生成排序后的有序因子:
sum_df <- sum_df %>% group_by(facet_var) %>% arrange(priority, desc(total)) %>% mutate(sort_rank = row_number()) %>% ungroup() # 将原数据的measure_summary转换为有序因子 df <- df %>% left_join(sum_df %>% select(facet_var, measure_summary, sort_rank), by = c("facet_var", "measure_summary")) %>% mutate(measure_summary = factor(measure_summary, levels = sum_df$measure_summary[order(sum_df$sort_rank)], ordered = TRUE))
步骤4:绘制图表
此时measure_summary已经按需求排序,直接用ggplot分面绘图即可:
library(ggplot2) ggplot(df, aes(x = measure_summary, y = value)) + geom_col(stat = "sum") + # 根据你的图表类型调整,比如geom_bar facet_wrap(~facet_var) + # 替换成你的分面字段 coord_flip() # 如果是横向条形图,可添加此参数
关键说明
- 优先级数值越小,排序越靠前,给小计设一个极大值(比如99)就能确保它在分面底部
- 如果后续添加小计数据,只需保证小计的
measure_summary名称和case_when中的匹配即可 - 若你的分面是
facet_grid,代码逻辑完全通用,只需替换分面参数
内容的提问来源于stack exchange,提问作者Marc Alexander
相关产品推荐
相关产品推荐

