You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:43:31