如何用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
相关产品推荐
相关产品推荐

