基于R语言生成与重排序分组条形图匹配的有序数据表
匹配重排序条形图的数据表生成方案
嘿,我完全get你的需求——就是想让汇总后的数据表和你按主分组总计数排序的条形图保持一模一样的顺序对吧?这事儿核心就是让数据表的因子水平和条形图的排序逻辑对齐,我来一步步给你演示怎么做:
首先先回顾下你已经写好的基础代码:
library(magrittr) library(dplyr) df <- mtcars df$gear <- as.factor(df$gear) df$carb <- as.factor(df$carb) car_summary <- df %>% group_by(carb, gear) %>% summarize(Count = n())
方法一:提前排序因子水平(适合后续多次复用)
这种方法会先把原始数据里的carb因子按总计数重新排序,之后生成的所有汇总表都会自动沿用这个顺序:
# 第一步:计算每个carb的总计数,确定排序依据 carb_total_counts <- df %>% group_by(carb) %>% summarize(total = n()) %>% arrange(desc(total)) # 这里用desc是降序,要升序就去掉desc # 第二步:重新设置carb的因子水平,按照总计数的顺序排列 df$carb <- factor(df$carb, levels = carb_total_counts$carb) # 第三步:生成排序后的汇总表,此时carb的顺序已经和你的条形图一致了 car_summary_sorted <- df %>% group_by(carb, gear) %>% summarize(Count = n()) %>% ungroup() # 取消分组,方便查看整表
方法二:直接在汇总表上处理(更简洁,一步到位)
如果你不想修改原始数据,也可以直接在已有的car_summary上做排序调整:
library(forcats) # 需要用到fct_reorder函数,tidyverse默认包含这个包 car_summary_sorted <- car_summary %>% # 先计算每个carb的总计数,作为排序的依据 group_by(carb) %>% mutate(carb_total = sum(Count)) %>% ungroup() %>% # 按总计数降序重新排列carb的因子水平 mutate(carb = fct_reorder(carb, desc(carb_total))) %>% # 按排序后的carb和gear整理表格顺序 arrange(carb, gear) %>% # 去掉临时的总计数列(如果不需要的话) select(-carb_total)
验证匹配度
你之前的条形图代码应该是类似这样(用了因子重排序):
library(ggplot2) ggplot(car_summary_sorted, aes(x = carb, y = Count, fill = gear)) + geom_col(position = "dodge")
现在你打印car_summary_sorted,会发现carb的顺序和图表里的x轴顺序完全一致,完美匹配!
内容的提问来源于stack exchange,提问作者ds_guy




