R语言使用desc()函数绘制Top N高频条形图的问题
R语言绘制Top3高频条形图问题解决
问题说明
想要在R中按顺序可视化前3个(或N个)高频类别的条形图,参考相关方案时遇到问题:数据集仅包含类别列(无频率数值),使用desc()函数时不知道传入什么参数,导致代码报错。
数据集
| 行号 | values_1 |
|---|---|
| 1 | C123 |
| 2 | B323 |
| 3 | C123 |
| 4 | R333 |
| 5 | R334 |
| 6 | N123 |
| 7 | U322 |
| 8 | C123 |
| 9 | U322 |
| 10 | R444 |
可正常运行的全量条形图代码
library(ggplot2) Bars <- ggplot(df) + geom_bar(aes(x = values_1), bandwidth = 0.5) + ylab("Frequency") + xlab("My Values") plot(Bars)
尝试的Top3条形图代码及报错
尝试代码
library(dplyr) library(ggplot2) df %>% arrange(desc()) %>% slice(1:3) %>% ggplot(aes(x = values_1)) + geom_bar()
报错信息(中文翻译)
Error in arrange(): desc()必须传入恰好一个参数。
解决方案
原代码错误原因:arrange(desc())缺少排序依据的变量——原数据集仅存类别列,没有统计好的频率值,无法直接排序筛选。需要先统计每个类别的出现频率,再按频率筛选TopN后绘图,以下是两种常用方法:
方法1:先统计频率再筛选绘图
先通过count()统计每个类别的出现次数并降序排序,再取前3个类别绘图:
library(dplyr) library(ggplot2) # 统计频率并筛选Top3 top3_data <- df %>% count(values_1, sort = TRUE) %>% # 统计次数并按次数降序 slice(1:3) # 绘制Top3条形图 ggplot(top3_data, aes(x = values_1, y = n)) + geom_bar(stat = "identity") + # 因为已有数值n,用identity统计方式 ylab("Frequency") + xlab("My Values")
方法2:在ggplot中直接处理因子排序
利用forcats包的函数(ggplot2依赖该包),直接在x轴映射中处理类别顺序并筛选Top3:
library(ggplot2) ggplot(df, aes(x = forcats::fct_top_n(forcats::fct_infreq(values_1), n = 3))) + geom_bar() + ylab("Frequency") + xlab("My Values")
fct_infreq()会按类别出现频率排序因子,fct_top_n()则保留频率最高的前n个类别。
内容的提问来源于stack exchange,提问作者Usman YousafZai
相关产品推荐
相关产品推荐

