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

如何用R语言ggplot2为Top N分组创建带抖动点的箱线图

问题:为评分最多的前5个电影类型分组绘制带抖动点的箱线图

数据: 约1000万行,示例数据如下:

movie_title         movie_year movie_decade               genres         rating

Boomerang             1992         1990                Comedy|Romance      3.5     
Net, The              1995         2000         Action|Crime|Thriller      4.5
Dumb & Dumber         1994         1990                        Comedy      5
Outbreak              1995         2000  Action|Drama|Sci-Fi|Thriller      4.5
Stargate              1994         1990       Action|Adventure|Sci-Fi      3
Star Trek: Generations1994         1990 Action|Adventure|Drama|Sci-Fi      3.5

目标:
为评分数量最多的前5个按genres分组的类别,创建带抖动点的箱线图。分组汇总排序后的前5个类型如下:

genres                           no_of_ratings
 1 Drama                            815084
 2 Comedy                           778596
 3 Comedy|Romance                   406061
 4 Comedy|Drama                     359494
 5 Comedy|Drama|Romance             290231

类似示例:
想要创建的图表样式类似“均值点+标准差误差棒”的分组图(原示例为前30个类型),但将均值点和误差棒替换为箱线图与抖动点。

当前无效代码:

temp %>%
    group_by(genres) %>%
    summarise(no_of_ratings = length(rating)) %>%
    arrange(desc(no_of_ratings)) %>%
    top_n(5, no_of_ratings) %>%
    ggplot(aes(genres, rating)) +
    geom_boxplot() +
    geom_jitter(width = 0.1, alpha = 0.2) + 
    coord_flip()

报错信息:
object 'rating' not found

原因:summarise操作会将每个分组压缩为一行,仅保留genres和no_of_ratings字段,原始的rating数据已丢失,因此ggplot无法找到该变量。


解决方案

核心思路:先筛选出评分最多的前5个类型,再从原始数据中提取对应记录进行绘图,避免丢失rating字段。

方案1:先提取Top5类型列表,再筛选原始数据

# 获取评分最多的前5个类型
top5_genres <- temp %>%
  group_by(genres) %>%
  summarise(no_of_ratings = n()) %>%  # n()等价于length(rating)
  arrange(desc(no_of_ratings)) %>%
  top_n(5, no_of_ratings) %>%
  pull(genres)  # 提取类型名称转为向量

# 用原始数据筛选对应类型并绘图
temp %>%
  filter(genres %in% top5_genres) %>%
  ggplot(aes(x = genres, y = rating)) +
  geom_boxplot() +
  geom_jitter(width = 0.1, alpha = 0.2) +  # 抖动点避免重叠,alpha降低透明度
  coord_flip()

方案2:通过合并保留原始数据(适合需要同时展示汇总信息的场景)

temp %>%
  # 为每条记录添加对应类型的评分数量
  group_by(genres) %>%
  mutate(no_of_ratings = n()) %>%
  ungroup() %>%
  # 筛选出前5个类型的所有记录
  filter(genres %in% (.[["genres"]][order(.$no_of_ratings, decreasing = TRUE)][1:5])) %>%
  ggplot(aes(x = genres, y = rating)) +
  geom_boxplot() +
  geom_jitter(width = 0.1, alpha = 0.2) +
  coord_flip()

内容的提问来源于stack exchange,提问作者dakaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:38:35