如何在R的ggplot中仅选取总计数Top N组进行绘图
问题分析与解决方案
原代码报错的核心原因:你用count(Tencode.Description)只统计了每个Tencode组的总计数,这一步直接把Year列从数据中丢弃了,后续ggplot调用Year作为x轴自然会找不到该变量。
要实现“展示总计数前N的Tencode组+按年度计数展示”的需求,需要先保留年度维度的计数,再基于总计数筛选分组,具体修正代码如下:
library(tidyverse) library(scales) # 1. 先按Tencode和Year分组统计年度计数,同时计算每个Tencode的总计数 top_ten_tencode <- complete_df %>% na.omit() %>% # 先处理缺失值,避免后续统计出错 count(Tencode.Description, Year, name = "year_count") %>% # 按组+年度计数 group_by(Tencode.Description) %>% mutate(total_count = sum(year_count)) %>% # 计算每个Tencode的总计数 ungroup() %>% # 2. 筛选总计数排名前10的Tencode组 filter(Tencode.Description %in% ( . %>% arrange(desc(total_count)) %>% pull(Tencode.Description) %>% head(10) )) %>% # 3. 按总计数降序重新排序Tencode因子,保证绘图时顺序正确 mutate(Tencode.Description = fct_reorder(Tencode.Description, -total_count)) # 4. 绘制分组柱状图 ggplot(top_ten_tencode, aes(x = Year, y = year_count, fill = Tencode.Description)) + geom_bar(stat = "identity", position = position_dodge()) + # 用已统计好的year_count,指定stat=identity scale_y_log10(labels = comma) + labs(fill = "Tencode", x = "Year", y = "Count") + theme( axis.title.x = element_text(color="black", size=15, face="bold"), axis.title.y = element_text(color="black", size=15, face="bold"), legend.title = element_text(colour = "black", size = 10, face = "bold"), legend.text = element_text(colour = "black", size = 10, face = "plain"), axis.text.x = element_text(colour = "black", size = 10, face = "plain"), axis.text.y = element_text(colour = "black", size = 10, face = "plain") )
关键修正点说明:
- 先通过
count(Tencode.Description, Year)保留年度维度的计数,避免丢失Year信息 - 新增
total_count列计算每个Tencode的总计数,以此为依据筛选前10组 - 用
fct_reorder(Tencode.Description, -total_count)让Tencode按总计数降序排列,符合“影响力最大在前”的需求 - 绘制柱状图时指定
stat = "identity",因为我们已经提前统计好了计数,不需要ggplot再自动统计
内容的提问来源于stack exchange,提问作者Dinho
相关产品推荐
相关产品推荐

