ggplot展示Top15犯罪类型性别分布:简化实现方法问询
简化实现方案
可以通过dplyr管道链直接完成统计、过滤、绘图的全流程,无需创建多个中间数据框,同时能同步输出统计表格。以下是两种高效实现方式:
方法一:关联式过滤+管道内多操作
这种方式先统计各犯罪类型的总数量并筛选Top15,再关联回原数据进行性别分布统计,全程用管道衔接:
library(tidyverse) library(knitr) # 管道式完成统计、绘图、输出表格 LA2020 %>% # 统计所有犯罪类型的总发生数,取Top15 count(crime_description, name = "total") %>% arrange(desc(total)) %>% slice_head(n = 15) %>% # 关联原数据,仅保留Top15的犯罪记录 inner_join(LA2020, by = "crime_description") %>% # 按犯罪类型+受害者性别统计数量 count(crime_description, victim_sex, name = "victim_count") %>% # 在管道内同时输出统计表格并绘图 { stats_table <- . # 输出格式化统计表格 kable(stats_table, caption = "洛杉矶2020年Top15犯罪类型的受害者性别分布统计") %>% print() # 继续传递数据到ggplot绘图 stats_table %>% ggplot(aes( x = reorder(crime_description, -victim_count, sum), # 按总数量降序排序x轴 y = victim_count, fill = victim_sex )) + geom_col(position = position_dodge(width = 0.8)) + # 分组条形图 labs( title = "2020年洛杉矶Top15犯罪类型的受害者性别分布", x = "犯罪类型", y = "受害者数量", fill = "受害者性别" ) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠 }
方法二:先提取Top15类型再过滤
这种方式先提取Top15犯罪类型的向量,再直接过滤原数据,减少中间关联操作,效率更高:
library(tidyverse) library(knitr) LA2020 %>% # 嵌套管道:先获取Top15犯罪类型的向量 { top_crime_list <- . %>% count(crime_description) %>% arrange(desc(n)) %>% slice_head(n = 15) %>% pull(crime_description) # 提取为字符向量 # 过滤原数据到Top15类型,再统计性别分布 filter(., crime_description %in% top_crime_list) %>% count(crime_description, victim_sex, name = "victim_count") } %>% # 同步输出表格并绘图 { stats_table <- . kable(stats_table, caption = "Top15犯罪类型受害者性别统计") %>% print() stats_table %>% ggplot(aes( x = reorder(crime_description, -victim_count, sum), y = victim_count, fill = victim_sex )) + geom_col(position = "dodge") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x = "犯罪类型", y = "数量", fill = "受害者性别") }
关键优化点
- 用
slice_head(n=15)替代手动筛选Top15,代码更简洁。 - 管道内用
{}实现多操作:既输出统计表格,又不中断绘图流程。 reorder()函数直接在ggplot中按总数量排序x轴,无需额外排序步骤。- 避免多次
left_join,改用inner_join或%in%过滤,提升代码效率。
内容的提问来源于stack exchange,提问作者a1cswiz
相关产品推荐
相关产品推荐

