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

如何绘制按年度数值排序的分类水平条形图

解决方法:按年份分组排序的水平条形图

没问题,我来帮你搞定这个水平条形图的排序需求!先提个小细节:你代码里的列名yeat应该是year,我后面的代码会先修正这个小疏漏~

核心思路是:要让每个年份内的类别按对应数值排序,我们需要把categories列转换成「基于各年份内数值大小排序的因子」,这样绘图工具就会按照我们想要的顺序渲染条形。

方法一:用ggplot2(推荐,灵活美观)

首先加载需要的包,处理数据排序,再绘图:

# 先修正列名拼写错误
names(data)[names(data) == "yeat"] <- "year"

# 加载所需包
library(dplyr)
library(ggplot2)

# 按年份分组,将categories按value降序转换为因子
data_sorted <- data %>%
  group_by(year) %>%
  mutate(categories = forcats::fct_reorder(categories, value, .desc = TRUE)) %>%
  ungroup()

# 绘制水平条形图
ggplot(data_sorted, aes(x = value, y = categories, fill = factor(year))) +
  geom_bar(stat = "identity", position = "dodge") + # 让不同年份的条形并排显示
  labs(
    title = "各年份类别按数值排序的水平条形图",
    x = "数值",
    y = "类别",
    fill = "年份"
  ) +
  theme_minimal()

代码解释:

  • fct_reorder() 是forcats包的函数,它会根据value的大小重新排列categories的因子水平,.desc = TRUE表示降序排列,如果你想要升序,改成FALSE即可。
  • position = "dodge" 让同类别不同年份的条形并排,避免堆叠。

方法二:用Base R(无需额外包)

如果你不想加载第三方包,用Base R也能实现:

# 修正列名
names(data)[names(data) == "yeat"] <- "year"

# 按年份分组,将categories转换为按value降序排序的因子
data$categories <- with(data, ave(value, year, FUN = function(x) {
  factor(categories, levels = categories[order(-x)])
}))

# 绘制水平条形图
barplot(
  tapply(data$value, list(data$categories, data$year), sum),
  horiz = TRUE,
  beside = TRUE, # 并排显示不同年份的条形
  col = c("#1f77b4", "#ff7f0e"),
  xlab = "数值",
  ylab = "类别",
  main = "各年份类别按数值排序的水平条形图"
)
# 添加图例
legend("topright", legend = unique(data$year), fill = c("#1f77b4", "#ff7f0e"))

这样两种方法都能实现你想要的「每个年份下类别按数值排序」的水平条形图效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:42:29