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

R语言使用desc()函数绘制Top N高频条形图的问题

R语言绘制Top3高频条形图问题解决

问题说明

想要在R中按顺序可视化前3个(或N个)高频类别的条形图,参考相关方案时遇到问题:数据集仅包含类别列(无频率数值),使用desc()函数时不知道传入什么参数,导致代码报错。

数据集

行号values_1
1C123
2B323
3C123
4R333
5R334
6N123
7U322
8C123
9U322
10R444

可正常运行的全量条形图代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:35:23